好吧,现在在你澄清你真正想做的事情之后,我很确定这是正确的答案:
您可能习惯了称为ModelView
矩阵。它本质上由两部分组成,你不觉得很奇怪吗?嗯,这是对我来说的,我想了一会儿,这是有道理的。最终顶点位置计算如下:
gl_Position = ProjectionMat * ModelViewMat * VertexPos;
你看,无论你将“相机”从原点移动多少,对于 OpenGL 来说都没有区别[x,y,z]
或通过以下方式移动对象[-x,-y,-z]
- 你会得到相同的结果。然而,将“相机”位置区分为可能与原点不同的位置是有用的。
gl_Position = ProjectionMat * ViewMat * ModelMat * VertexPos;
正如我所说,我认为最自然的方法是将计算分成两个矩阵:Model
and View
。现在场景中的每个对象都必须改变Model
矩阵,相机位置通过改变来设置View
矩阵。说得通?
我给你举个例子。如果您的相机位于[5,0,0]
(对应于Translate(-5,0,0)
),以及你的对象[-5,0,0]
,它将着陆距离相机 10 个单位。现在,当您将相机进一步远离原点(增加第一个平移距离)时,“相机”和物体之间的距离就会增加。
对象翻译是该模型,相机平移为the View.
所以不难得出结论,如果你想ignore相机位置,只需剥离View
等式中的一部分;现在将绘制每个对象without考虑相机位置,因此仅相对于您的视口。
gl_Position = ProjectionMat * ModelMat * VertexPos;
我们的假设模型现在将从视口沿 X 轴着陆 5 个单位不管您当前正在“关注”的内容,我认为这几乎就是您想要实现的目标。
无论如何,你可能会使用一个很好的教程