旋转由其法线及其距离定义的平面
我一直在努力解决在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