围绕任意轴旋转的3D数学

时间:2015-12-28 10:07:16

标签: opengl math 3d

我正在使用现代opengl,我需要一些绕任意轴旋转的帮助。所以基本上当我旋转3D模型时,我还需要旋转它的碰撞盒。 glm处理模型本身的所有旋转数学运算我只需要能够旋转碰撞盒。我尝试了解这一点,但我遇到了麻烦,有人可以帮忙解决这个问题吗? https://www.siggraph.org/education/materials/HyperGraph/modeling/mod_tran/3drota.htm

if (model->collision_box->aX.x >= this->collision_box->ax.x && this->collision_box->aX.x > model->collision_box->ax.x){
    if (model->collision_box->aY.y >= this->collision_box->ay.y && this->collision_box->aY.y > model->collision_box->ay.y){
        if (model->collision_box->aZ.z >= this->collision_box->az.z && this->collision_box->aZ.z > model->collision_box->az.z){
            mx = 0;//stop movement
            my = 0;
            mz = 0;
        }
    }
}            

碰撞:btw碰撞盒的8个点存储为vec3点,以便它们可以旋转。它不仅仅是最小/最大。此外,如果我使用凸面碰撞盒,我仍然需要绕任意轴旋转!

1 个答案:

答案 0 :(得分:1)

当你有一个对象的边界框被定义为其顶点的最小值和最大值时,你所拥有的是 A xis A 已签名 B < / strong> ounding Box。当对象像对象一样移动或旋转时更新:

Dynamic AABB

框与主轴保持对齐。如果您将该框与对象一起旋转,则您有一个 O 对象 A 已签名 B ounding B ox除非修改了对象顶点(或缩放了对象顶点),否则不需要更新其维度。

以下是AABB与OOBB的示例。

AABB vs OOBB

AABB交叉更有效,但OOBB更易于维护动态对象。对于一阶测试,您还可以使用球面边界体积(旋转不变)。

PS:GIF的赠与金,来自视频here