旋转由其法线及其距离定义的平面

我一直在努力解决在3D空间中旋转飞机的问题,但我一直在死路一条。 以下是情况:

我有一个物理引擎,模拟一个立方体内的移动球体。 为了使事情更简单,我只绘制了顶部和底部平面并垂直移动了球体。 我已经定义了我的两架飞机,如下所示:

CollisionPlane* p = new CollisionPlane(glm::vec3(0.0, 1.0, 0.0), -5.0);
CollisionPlane* p2 = new CollisionPlane(glm::vec3(0.0, -1.0, 0.0), -5.0);

vec3定义平面法线,第二个参数定义平面距法线的距离。 我把它们的距离定义为-5的原因是因为我已经在所有轴上将代表我的两个平面的模型缩放了10 ,所以现在距离原点的距离是5到顶部和底部,如果这是有意义的。

为了给你一些参考,我将两个平面创建为两个线循环,并且我有一个建模这两个线循环的模型,如下所示:

top plane:
std::shared_ptr<Mesh> f1 = std::make_shared<Mesh>(GL_LINE_LOOP);
std::vector<Vertex> verts = { Vertex(glm::vec3(0.5, 0.5, 0.5)), Vertex(glm::vec3(0.5, 0.5, -0.5)), Vertex(glm::vec3(-0.5, 0.5, -0.5)), Vertex(glm::vec3(-0.5, 0.5, 0.5)) };
f1->BufferVertices(verts);

bottom plane:
std::shared_ptr<Mesh> f2 = std::make_shared<Mesh>(GL_LINE_LOOP);
std::vector<Vertex> verts2 = { Vertex(glm::vec3(0.5, -0.5, 0.5)), Vertex(glm::vec3(0.5, -0.5, -0.5)), Vertex(glm::vec3(-0.5, -0.5, -0.5)), Vertex(glm::vec3(-0.5, -0.5, 0.5)) };
f2->BufferVertices(verts2);

std::shared_ptr<Model> faceModel = std::make_shared<Model>(std::vector<std::shared_ptr<Mesh>> {f1, f2 });

就像我说过的,我把模型缩小10

现在我有一个可以上下移动的球体,并且碰撞到每个脸部,并且碰撞响应也被执行。 在这里输入图像描述

我面临的问题是当我尝试旋转我的飞机时。 当我围绕Z轴旋转时似乎工作得很好,但是当我围绕X轴旋转时,它似乎不起作用。 以下显示绕Z旋转的结果:

在这里输入图像描述

但是,如果我尝试围绕X旋转,则球会穿透底部平面,就好像碰撞平面向下移动一样:

在这里输入图像描述

以下是我尝试旋转法线和平面的代码:

for (int i = 0; i < m_entities.size(); ++i)
    {
        glm::mat3 normalMatrix = glm::mat3_cast(glm::angleAxis(glm::radians(6.0f), glm::vec3(0.0, 0.0, 1.0)));

        CollisionPlane* p = (CollisionPlane*)m_entities[i]->GetCollisionVolume();
        glm::vec3 normalDivLength = p->GetNormal() / glm::length(p->GetNormal());
        glm::vec3 pointOnPlane = normalDivLength * p->GetDistance();
        glm::vec3 newNormal = normalMatrix * normalDivLength;

        glm::vec3 newPointOnPlane = newNormal * (normalMatrix * (pointOnPlane - glm::vec3(0.0)) + glm::vec3(0.0));

        p->SetNormal(newNormal);
        float newDistance = newPointOnPlane.x + newPointOnPlane.y + newPointOnPlane.z;
        p->SetDistance(newDistance);
    }

我已经做了同样的事情绕X轴旋转,只是改变了glm::vec3(0.0, 0.0, 1.0)glm::vec3(1.0, 0.0, 0.0)

m_entites基本上是我的物理实体,它们拥有不同的碰撞形状(球体平面等)。 我在这里根据我的代码根据正常和距离旋转飞机

我似乎无法理解为什么当我围绕Z旋转时,它的工作原理,但不是当我围绕X旋转时。我是否错过了一些至关重要的东西?

链接地址: http://www.djcxy.com/p/50015.html

上一篇: Rotate a plane defined by its normal and its distance

下一篇: Bullet vs Newton Game Dynamics vs ODE physics engines