好的,现在在你澄清了你真正想做的事情之后,我很确定这是正确的答案:
你可能已经习惯了一种叫做ModelView
矩阵的东西。它本质上是由两部分组合而成的,你不觉得奇怪吗?嗯,这是给我的,在我想了一会儿之后,它是有道理的。最终顶点位置计算如下:
gl_Position = ProjectionMat * ModelViewMat * VertexPos;
[x,y,z]
您会看到,无论您将“相机”从原点移动还是从原点移动对象,OpenGL 都没有区别[-x,-y,-z]
- 您将获得相同的结果。然而,将“相机”位置区分为可能与原点不同的位置是有用的。
gl_Position = ProjectionMat * ViewMat * ModelMat * VertexPos;
我认为最自然的方法是,正如我所说,将计算分成两个矩阵:Model
和View
。现在场景中的每个对象都必须更改Model
矩阵,并且通过更改矩阵来设置相机位置View
。说得通?
我给你举个例子。如果您的相机在[5,0,0]
(对应于Translate(-5,0,0)
),并且您的对象在[-5,0,0]
,它将从相机降落 10 个单位。现在,当您将相机远离原点(增加第一个平移距离)时,“相机”和对象之间的距离会增加。
对象平移是Model,相机平移是View。
所以不难得出结论,如果你想忽略相机位置,只需View
从方程中去掉部分;现在将在不考虑相机位置的情况下绘制每个对象,因此仅相对于您的视口。
gl_Position = ProjectionMat * ModelMat * VertexPos;
我们假设的模型现在将从视口沿 X 轴降落 5 个单位,无论您当前“查看”什么,我认为这几乎是您想要实现的。
无论如何,您可能可以使用一个不错的教程