我正和一些朋友一起玩游戏。目前,我们正在尝试使控件正常工作,即WASD在4个主要方向上移动,并使用鼠标旋转视图。
问题是我们遇到了矩阵的困难,特别是视图矩阵。在过去的几周里,我已经阅读了更多关于矩阵的教程,我理解基本原理,以及如何做一些简单的事情,但我仍然缺乏对它们如何结合在一起的基本理解。
现在,我们的主要问题是让相机转换按照人们的预期行事。使用我所看到的教程,相机转换都沿着局部轴发生,这会导致一些奇怪的行为,例如,在移动一点之后,我很容易就会侧身,甚至是上下颠倒。
这是我用来旋转视图矩阵的两个函数,如我所看到的所有教程中所示:
def xrotate(M,theta):
t = math.pi*theta/180
cosT = math.cos( t )
sinT = math.sin( t )
R = numpy.array(
[[ 1.0, 0.0, 0.0, 0.0 ],
[ 0.0, cosT,-sinT, 0.0 ],
[ 0.0, sinT, cosT, 0.0 ],
[ 0.0, 0.0, 0.0, 1.0 ]], dtype=np.float32)
M[...] = np.dot(M,R)
def yrotate(M,theta):
t = math.pi*theta/180
cosT = math.cos( t )
sinT = math.sin( t )
R = numpy.array(
[[ cosT, 0.0, sinT, 0.0 ],
[ 0.0, 1.0, 0.0, 0.0 ],
[-sinT, 0.0, cosT, 0.0 ],
[ 0.0, 0.0, 0.0, 1.0 ]], dtype=np.float32)
M[...] = np.dot(M,R)
我如何在全球空间中应用视图矩阵变换?
哦,而且,如果你知道任何非常好的矩阵教程,不要只是说'这里的数学很复杂,所以我们不会进入它,只知道它有效&# 39;,我很想看看。
答案 0 :(得分:0)
所有关于操作的顺序:
Vmodel
,这是你从网格
Vworld
,这是您MatModel*Vmodel
时获得的结果;这是世界中顶点的位置
Vcamera
,这是您MatView*Vworld = MatView*MatModel*Vmodel
时获得的结果;这是投影前相对于相机的位置
Vscreen
,这是您应用投影矩阵后屏幕上的最终位置:MatProj*Vcamera=MatProj*MatView*Vworld = MatProj*MatView*MatModel*Vmodel;
MatProj*MatView*MatModel
一起是你听到的MVP矩阵。
要将相机向左移动,您可以将View矩阵与移动矩阵相乘,该移动矩阵将转换为正X方向或转换为相机的右矢量。
对于标准FPS风格的航向俯仰摄像机(向上总是向天空),当航向或俯仰变化时,您将重新创建整个矩阵。
MatView = xrotate(pitch)*yrotate(heading)*translate(-cameraPos);