Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Libgdx How to rotate a 3D model on multiple axes with phone orientation

I'm trying to rotate a 3D model on multiple axes at once using the phone's accelerometers. When I do this, I use setToRotation() however, this only does one axis at a time.

For example:

  ModelInstance modelInstance = instances.first(); 

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

The phone is in forced-landscape mode. I get the instance of the model I want to rotate.

I set the Vector3 phoneAccel based on Gdx.input.getAccelerometerX/Y/Z().

In the above example, both lines of code work correctly, but only independently. When I try to use both (one after another) the first rotate (ROLL) is removed. I would have thought the two rotation matrices would be cumulated, ie, the Z Axis is applied a rotation, and then the X Axis is applied a rotation.

Do I need to create my own cumulative rotation matrix, and then apply that at the end?

Any thoughts? Cheers

like image 678
Jammo Avatar asked Dec 25 '22 11:12

Jammo


1 Answers

Matrix4#setToRotation will remove any other transformation (like rotation) previously set (hence the name "setTo"). To add a rotation transformation to an already rotated matrix, use the rotate method instead. This will post-multiply the transformation.

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

However this will not produce your desired result, since you want the rotations to independent from each other (the rotation around the Z axis should not influence the rotation around the X axis for example). For this you can use euler angles:

modelInstance.transform.setFromEulerAngles(yaw, pitch, roll);
like image 66
Xoppa Avatar answered Mar 29 '23 23:03

Xoppa