Libgdx如何通过电话方向在多个轴上旋转3D模型

时间:2014-04-03 12:25:09

标签: java android matrix 3d libgdx

我尝试使用手机的加速度计一次在多个轴上旋转3D模型。当我这样做时,我使用setToRotation()但是,这一次只能做一个轴。

例如:

  ModelInstance modelInstance = instances.first(); 

  //ROLL
  modelInstance.transform.setToRotation(Vector3.Z, phoneAccel.y*9);
  //PITCH
  modelInstance.transform.setToRotation(Vector3.X, phoneAccel.z*9);

手机处于强制横向模式。我得到了我想要旋转的模型的实例。

我根据Vector3 phoneAccel设置Gdx.input.getAccelerometerX/Y/Z()

在上面的示例中,两行代码都能正常工作,但只能独立工作。当我尝试使用两者(一个接一个)时,第一次旋转(ROLL)被移除。我原本认为两个旋转矩阵会累积,即Z轴应用旋转,然后X轴应用旋转。

我是否需要创建自己的累积旋转矩阵,然后在最后应用它?

有什么想法?干杯

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

方法setToRotation将模型设置为此轮换,如名称所示。这意味着,您将“覆盖”Z轴周围的旋转,并将其设置为仅在X轴周围旋转。

有不同的方法可以实现您想要实现的目标:

  • 您可以像@noone说的那样使用Quaternion
  • 您可以使用rotate。如果你这样做,你需要在例如Vector2中存储当前的旋转,其中x值是Z轴的当前旋转,y值是X轴周围的旋转。
  • 您可以使用自定义轴setToRotation来构建phoneAccel值。

setToRotation方法为您提供了定义Vector3 directionVector3 face的可能性,定义了哪个面应朝这个方向看。 例如: modelInstance.transform.setToRotation(Vector3.Z, Vector3.Y)将使他看起来像Z-Direction。 Vector3(0, -1, 0)他的底部(也许是他的脚)会向那个方向看。

希望很清楚