1

我遇到的问题是我无法在 OpenGL 中获得“视线”矢量。我做了一些研究,发现它应该是转换后的 Z 向量,但它不想工作。我有这段代码来检索块的速度(我希望它从“相机”向前移动),但它一直与相机无关,但与渲染世界相比,它一直以相同的方式移动:

GLfloat matrix[16]; 
    glGetFloatv (GL_MODELVIEW_MATRIX, matrix);
    GLfloat d = sqrt( matrix[8]*matrix[8] + matrix[9]*matrix[9] + matrix[10]*matrix[10]);
    xmov = matrix[8]/d;
    ymov = matrix[9]/d;
    zmov = matrix[10]/d;

我做错了什么?

4

1 回答 1

2

好的,现在在你澄清了你真正想做的事情之后,我很确定这是正确的答案:

你可能已经习惯了一种叫做ModelView矩阵的东西。它本质上是由两部分组合而成的,你不觉得奇怪吗?嗯,这是给我的,在我想了一会儿之后,它是有道理的。最终顶点位置计算如下:

gl_Position = ProjectionMat * ModelViewMat * VertexPos;

[x,y,z]您会看到,无论您将“相机”从原点移动还是从原点移动对象,OpenGL 都没有区别[-x,-y,-z]- 您将获得相同的结果。然而,将“相机”位置区分为可能与原点不同的位置是有用的。

gl_Position = ProjectionMat * ViewMat * ModelMat * VertexPos;

我认为最自然的方法是,正如我所说,将计算分成两个矩阵:ModelView。现在场景中的每个对象都必须更改Model矩阵,并且通过更改矩阵来设置相机位置View。说得通?

我给你举个例子。如果您的相机在[5,0,0](对应于Translate(-5,0,0)),并且您的对象在[-5,0,0],它将从相机降落 10 个单位。现在,当您将相机远离原点(增加第一个平移距离)时,“相机”和对象之间的距离会增加。

对象平移是Model,相机平移是View

所以不难得出结论,如果你想忽略相机位置,只需View从方程中去掉部分;现在将在考虑相机位置的情况下绘制每个对象,因此仅相对于您的视口。

gl_Position = ProjectionMat * ModelMat * VertexPos;

我们假设的模型现在将从视口沿 X 轴降落 5 个单位,无论您当前“查看”什么,我认为这几乎是您想要实现的。

无论如何,您可能可以使用一个不错的教程

于 2013-01-11T17:21:02.637 回答