Libgdx如何通过电话方向在多个轴上旋转3D模型
我正在尝试使用手机的加速度计一次在多个轴上旋转3D模型。 当我这样做时,我使用setToRotation()
但是,这一次只能做一个轴。
例如:
ModelInstance modelInstance = instances.first(); //ROLL modelInstance.transform.setToRotation(Vector3.Z, phoneAccel.y*9); //PITCH modelInstance.transform.setToRotation(Vector3.X, phoneAccel.z*9);
手机处于强制横向模式。 我得到了我想要旋转的模型的实例。
我根据Gdx.input.getAccelerometerX/Y/Z()
设置了Vector3 phoneAccel
。
在上面的示例中,两行代码都正常工作,但只能独立工作。 当我尝试使用两者(一个接一个)时,第一次旋转(ROLL)被移除。 我原本认为两个旋转矩阵将累积,即Z轴应用旋转,然后X轴应用旋转。
我是否需要创建自己的累积旋转矩阵,然后在最后应用它?
有什么想法吗? 干杯
Matrix4#setToRotation
将删除先前设置的任何其他转换(如旋转)(因此名称为“setTo”)。 要将旋转变换添加到已旋转的矩阵,请改用rotate
方法。 这将使变换后加倍。
modelInstance.transform.setToRotation(Vector3.Z, phoneAccel.y*9); modelInstance.transform.rotate(Vector3.X, phoneAccel.z*9);
但是,这不会产生您想要的结果,因为您希望旋转彼此独立(例如,围绕Z轴的旋转不应影响围绕X轴的旋转)。 为此,您可以使用欧拉角:
modelInstance.transform.setFromEulerAngles(yaw, pitch, roll);
方法setToRotation
将模型设置为此旋转,如名称所示。 这意味着,您“覆盖”Z轴周围的旋转并将其设置为仅在X轴周围旋转。
有不同的方法可以实现您想要实现的目标:
- 你可以像@noone一样使用
Quaternion
。 - 你可以使用
rotate
。 如果你这样做,你需要在例如Vector2
你当前的旋转,其中x值是Z轴的当前旋转,y值是X轴Vector2
的旋转。 - 您可以使用
setToRotation
和自定义轴,您可以使用自定义轴构建phoneAccel
值。
setToRotation
方法为您提供了定义Vector3 direction
和Vector3 face
的可能性,定义了哪个面应朝向此方向。 例如: modelInstance.transform.setToRotation(Vector3.Z, Vector3.Y)
将使他的顶部外观为Z-Direction。 使用Vector3(0, -1, 0)
他的底部(也许是他的脚)会向那个方向看。
希望很清楚