在我的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应用新操作。
答案 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 ]