0

据我了解,建议使用 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 或类似的东西。我在哪里搞砸了?

4

1 回答 1

2

gluLookAt 是一个非常方便的函数,绝对没有性能损失。没有理由不使用它,最重要的是,没有“硬件与软件”的考虑。正如 Mk12 所说,glRotatef 也在 CPU 上完成。GPU部分是:gl_Position = ProjectionMatrix x ViewMatrix x ModelMatrix x VertexPosition。

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

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

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

  • 在相机空间中追踪光线:光线总是从 (0,0,0) 开始并到达 (0,0,-1)。几何必须从模型空间转换到世界空间,然后再到相机空间,这让你很烦
  • 在世界空间中跟踪光线:光线从相机位置(在世界空间中)开始并到达(eyeCenter - eyePos).normalize()。几何必须从模型空间转换到世界空间。

请注意,没有第三个选项(在模型空间中跟踪光线)可以避免将几何图形从模型空间转换到世界空间。但是,您有两种解决方法:

  • 首先,您的游戏世界可能是静止的:模型矩阵可能始终是恒等式。所以把它的几何体从模型空间转换到世界空间就等于什么都不做。
  • 其次,对于所有其他对象,您可以采取相反的方法。与其在一个方向上变换整个几何体,不如只变换光线到另一个方向:取你的模型矩阵,逆它,你就得到了一个从世界空间到模型空间的矩阵。将你的光线的原点和方向乘以这个矩阵:你的光线现在在模型空间中。以正常方式相交。完毕。

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

于 2010-09-10T00:44:57.183 回答