据我了解,建议使用 glTranslate / glRotate 来支持 glutLootAt。除了明显的硬件与软件计算模式之外,我不会寻找原因,而只是顺其自然。但是,这让我有些头疼,因为我不知道如何有效地阻止相机突破墙壁。我只对点平面交叉点感兴趣,而不是 AABB 或其他任何东西。
因此,使用 glTranslates 和 glRotates 意味着当世界围绕它旋转时,视点保持静止(为简单起见在 (0,0,0) 处)。这对我来说意味着为了检查任何交点,我现在需要为每个摄像机移动重新计算世界顶点坐标(glutLookAt 方法不需要)。由于无法从 GPU 领域获得所需的新坐标,因此需要在 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 是一个 float[16] 填充 0.f 或 8.67453e-13 或类似的东西。我在哪里搞砸了?