我遇到的问题是我无法在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;
我做错了什么?
答案 0 :(得分:2)
好的,现在在你澄清了你真正想做的事情后,我很确定这是正确答案:
您可能习惯于称为ModelView
矩阵的东西。难道你觉得它基本上是由两部分组合而来的吗?嗯,这对我而言,在我考虑了一段时间后,它是有道理的。最终的顶点位置计算如下:
gl_Position = ProjectionMat * ModelViewMat * VertexPos;
你知道,无论你是通过[x,y,z]
从原点移动“相机”还是按[-x,-y,-z]
移动对象,OpenGL都没有区别 - 你会得到相同的结果。然而,将“相机”位置区分为可能与原点不同的东西是有用的。
gl_Position = ProjectionMat * ViewMat * ModelMat * VertexPos;
我认为,最自然的方法是,正如我所说,将计算分为两个矩阵:Model
和View
。现在,场景中的每个对象都必须更改Model
矩阵,并通过更改View
矩阵来设置摄像机位置。有意义吗?
我会举个例子。如果您的相机位于[5,0,0]
(对应于Translate(-5,0,0)
),而您的对象位于[-5,0,0]
,则它将从相机中落下10个单位。现在,当您将相机远离原点移动时(增加第一个平移距离),“相机”与物体之间的距离会增大。
对象转换是模型,相机转换是视图。
所以不难得出结论,如果你想忽略摄像机位置,只需从等式中剥离View
部分;现在,每个对象都将被绘制而不考虑相机位置,因此仅相对于您的视口。
gl_Position = ProjectionMat * ModelMat * VertexPos;
我们假设的模型现在将从视口沿着X轴着陆5个单位,而不管你当前“正在看”的那个,我想,这就是你想要实现的目标
无论如何,您可以使用a nice tutorial about it