在OpenGL中的视线矢量

时间:2013-01-11 16:02:26

标签: opengl vector 3d

我遇到的问题是我无法在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;

我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

您可能习惯于称为ModelView矩阵的东西。难道你觉得它基本上是由两部分组合而来的吗?嗯,这对我而言,在我考虑了一段时间后,它是有道理的。最终的顶点位置计算如下:

gl_Position = ProjectionMat * ModelViewMat * VertexPos;

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

gl_Position = ProjectionMat * ViewMat * ModelMat * VertexPos;

我认为,最自然的方法是,正如我所说,将计算分为两个矩阵:ModelView。现在,场景中的每个对象都必须更改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