如何在世界空间中应用视图矩阵变换,而不是局部?

时间:2014-11-05 19:33:07

标签: python opengl math matrix game-engine

我正和一些朋友一起玩游戏。目前,我们正在尝试使控件正常工作,即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;,我很想看看。

1 个答案:

答案 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);