没有glutLookAt *函数的点 - 平面碰撞

时间:2010-09-04 14:31:54

标签: opengl collision-detection plane glrotate

据我所知,建议使用glTranslate / glRotate来支持glutLootAt。我不会去寻找明显的HW与SW计算模式之外的原因,而只是选择波形。然而,这让我有些头疼,因为我不知道如何有效地阻止相机突破墙壁。我只对点平面交叉点感兴趣,而不是AABB或其他任何东西。

因此,使用glTranslates和glRotates意味着视点保持静止(简单地在(0,0,0)),而世界围绕着它。这对我来说意味着为了检查任何交叉点,我现在需要为每个相机移动重新计算世界的顶点坐标(glutLookAt方法不需要)。 由于无法从GPU-land获得所需的新坐标,因此需要手动在CPU中计算。对于每一次相机运动...... :(

似乎需要将当前旋转保留在3个轴中的每一个旁边,并且相同用于平移。我的程序中没有使用缩放。我的问题:

1 - 上述推理有缺陷吗?怎么样 ? 2 - 如果没有,必须有办法避免这种重新计算。 我看到它的方式(并通过查看http://www.glprogramming.com/red/appendixf.html)它需要一个矩阵乘法用于平移,另一个用于旋转(仅需要除y轴所需)。然而,必须计算如此多的加法/乘法,特别是正弦/余弦,肯定会杀死FPS。计算上将有数千甚至数万个顶点。每一帧......所有的数学......在计算出世界的新坐标之后,事物似乎很容易 - 只要看看是否有任何平面改变了它的'd'符号(从飞机方程式ax + by + cz + d = 0)。如果是这样,请使用轻量级交叉产品方法来测试该点是否位于该平面的每个“移动”三角形内的空间内。

由于

编辑:我发现了glGet,我认为这是要走的路,但我不知道如何正确使用它:

    // Retains the current modelview matrix
//glPushMatrix();
glGetFloatv(GL_MODELVIEW_MATRIX, m_vt16CurrentMatrixVerts);
//glPopMatrix();

m_vt16CurrentMatrixVerts是一个浮点数[16],它填充0.f或8.67453e-13或类似的东西。我搞砸了哪里?

1 个答案:

答案 0 :(得分:2)

gluLookAt是一个非常方便的功能,完全没有性能损失。没有理由不使用它,最重要的是,没有“HW vs SW”的考虑。正如Mk12所述,glRotatef也在CPU上完成。 GPU部分是:gl_Position = ProjectionMatrix x ViewMatrix x ModelMatrix x VertexPosition。

“使用glTranslates和glRotates意味着视点保持静止” - > gluLookAt同样的事情

“at(0,0,0)为简单起见” - >不是为了简单,这是事实。但是,此(0,0,0)位于相机坐标系中。这是有道理的:相对于相机,相机就在原点......

现在,如果您想阻止相机穿过墙壁,通常的方法是从相机中追踪光线。我怀疑这就是你所说的(“检查任何交叉点”)。但是没有必要在相机空间中这样做。你可以在世界空间里做到这一点。这是一个比较:

  • 在相机空间中跟踪光线:光线总是从(0,0,0)开始并转到(0,0,-1)。必须将几何体从模型空间转换为世界空间,然后转换到相机空间,这是令您烦恼的事情
  • 在世界空间中追踪光线:光线从相机位置(在世界空间中)开始并转到(eyeCenter - eyePos).normalize()。几何必须从模型空间转换为世界空间。

请注意,没有第三个选项(模型空间中的跟踪光线)可避免将几何体从模型空间转换为世界空间。但是,您有一对解决方法:

  • 首先,您的游戏世界可能仍然存在:模型矩阵可能始终是身份。因此,将其几何形状从模型转换为世界空间相当于什么都不做。
  • 其次,对于所有其他对象,你可以采取相反的方法。在一个方向上转换整个几何体的Intead,只反过来转换光线:取你的模型矩阵,反转它,你就有了一个从世界空间到模型空间的矩阵。通过此矩阵乘以光线的原点和方向:您的光线现在位于模型空间中。正常方式相交。完成。

请注意,我所说的都是标准技术。没有黑客或其他奇怪的东西,只是数学:)