将Euler角度转换为VR的XYZ坐标



背景

我在我的移动设备上运行VTK KiwiViewer源代码,并使用它使用点云制作VR场景,用户的手机充当VR护目镜。

我从CMDeviceMotion获得attitude,它为我提供了x、y和z轴(分别为俯仰、滚转和偏航)的欧拉角。

我正在尝试在不使用Cardboard SDK的情况下获得谷歌Cardboard体验。原因是Kiwi已经导入了我需要测试的所有模型。

场景

Kiwi使用基于XYZ坐标系的相机位置焦点。以下是您必须使用的三个对象来定位VR视图:

  • 焦点:相机正在观察的点的xyz
  • 摄影机位置:摄影机在三维空间中的xyz
  • 相机向上:控制相机旋转的相对xyz

现在我总是把相机位置放在0,0,0。我使用带有Euler Angles*10的sin/cos焦点放置在距离相机10个单位的位置。设置摄影机位置焦点位置会自动将相机向上设置为可用的正确值。

设置焦点

x = -(sin(roll) * cos(pitch)) * 10;
y = cos(roll) * sin(pitch) * 10;
z = sin(yaw);
setCameraFocalPoint(x, y, z);

问题

我目前的设置还可以,但它有一些令人讨厌的怪癖。如何调整转换以获得更扎实的VR体验?

您需要了解Euler角度的约定(X * Y * Z很常见,但您的SDK可能会使用其他约定)。然后,查找相应的旋转矩阵。您的视图方向将是此矩阵的最后一列(如果使用右手坐标系,则为其倒数)。向上的方向将是第二列。

如果您的SDK允许您直接设置视图矩阵,则可以使用转置旋转矩阵(并添加第四行和第四列零和m44=1)。

最新更新