OpenGL在模型视图中使用左手坐标系

时间:2015-01-29 21:40:08

标签: android opengl-es

在我的OpenGL中,我想对模型空间使用左手坐标系,但对视图空间使用右手坐标系。那是因为如果我认为我是坐标系的起源:

  • 对我来说,通常情况下,远在我前面的那些人有一个正面的坐标,所以我必须在模型视图中使用左手坐标系
  • 如果我向后走,我可以将z -= 1放入创建我的视图矩阵的setLookAtM方法中,如果我向后走,我必须减去z值,如果我向后退去

我使用android.OpenGL.Matrix中的这些函数来创建我的视图和投影矩阵:

Matrix.setLookAtM(data, 0,     0, 0, 0,     0, 0, -1,     0, 1, 0);
Matrix.perspectiveM(projection, 45, width / height, 1f, 50f);

我可以做什么/我需要更改以获得上面描述的结果,以便模型的z轴指向屏幕但摄像机的z轴指向屏幕外?

如果这两个矩阵无法实现这一点,我必须像现在一样使用它,因为每次因为时间而渲染对象时,我都不想为每个modelMatrix应用新操作。

1 个答案:

答案 0 :(得分:1)

您可以使用任何所需的坐标系。

如果你想要一个左手世界坐标系,而是一个右手眼坐标系,这意味着你需要在视图转换中翻转手部。您可以将镜像转换作为视图矩阵的一部分来执行此操作。

唯一的轻微并发症是setLookAtM()不会支持这一点。它构建的矩阵是旋转和平移的组合,它保持了手性。您可以将结果与镜像变换组合。但是由于视图矩阵使用您传递的参数非常简单,因此您自己构建视图矩阵也很容易。

事实上,您的setLookAtM()电话:

setLookAtM(data, 0,     0, 0, 0,     0, 0, -1,     0, 1, 0);

构建一个单位矩阵。因此,如果要翻转z坐标,请使用此镜像变换作为视图矩阵,而不是您现在拥有的单位矩阵:

[ 1  0  0  0 ]
[ 0  1  0  0 ]
[ 0  0 -1  0 ]
[ 0  0  0  1 ]