据我所知,建议使用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或类似的东西。我搞砸了哪里?
答案 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)位于相机坐标系中。这是有道理的:相对于相机,相机就在原点......
现在,如果您想阻止相机穿过墙壁,通常的方法是从相机中追踪光线。我怀疑这就是你所说的(“检查任何交叉点”)。但是没有必要在相机空间中这样做。你可以在世界空间里做到这一点。这是一个比较:
请注意,没有第三个选项(模型空间中的跟踪光线)可避免将几何体从模型空间转换为世界空间。但是,您有一对解决方法:
请注意,我所说的都是标准技术。没有黑客或其他奇怪的东西,只是数学:)