Java Libgdx如何使用手机方向在多个轴上旋转三维模型
我正在尝试使用手机的加速计同时在多个轴上旋转3D模型。执行此操作时,我使用Java Libgdx如何使用手机方向在多个轴上旋转三维模型,java,android,matrix,3d,libgdx,Java,Android,Matrix,3d,Libgdx,我正在尝试使用手机的加速计同时在多个轴上旋转3D模型。执行此操作时,我使用setToRotation()但是,一次只执行一个轴 例如: ModelInstance modelInstance = instances.first(); //ROLL modelInstance.transform.setToRotation(Vector3.Z, phoneAccel.y*9); //PITCH modelInstance.transform.setToRotation(Ve
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
在上面的示例中,两行代码都可以正常工作,但只能独立工作。当我尝试使用这两个(一个接一个)时,第一个旋转(滚动)被移除。我原以为这两个旋转矩阵会累加起来,也就是说,Z轴被应用一个旋转,然后X轴被应用一个旋转
我是否需要创建自己的累积旋转矩阵,然后在最后应用该矩阵
有什么想法吗?CheersMatrix4#setToRotation
将删除先前设置的任何其他变换(如旋转)(因此命名为“setTo”)。要向已旋转的矩阵添加旋转变换,请改用rotate
方法。这将对转换进行后期倍增
modelInstance.transform.setToRotation(Vector3.Z, phoneAccel.y*9);
modelInstance.transform.rotate(Vector3.X, phoneAccel.z*9);
但是,这不会产生所需的结果,因为您希望旋转彼此独立(例如,围绕Z轴的旋转不应影响围绕X轴的旋转)。为此,可以使用euler角度:
modelInstance.transform.setFromEulerAngles(yaw, pitch, roll);
方法
setToRotation
将模型设置为该旋转,如名称所示。这意味着您将“覆盖”Z轴周围的旋转,并将其设置为仅围绕X轴旋转
有不同的方法来实现您的目标:
- 你可以像@noone说的那样使用四元数
- 您可以使用
。如果执行此操作,则需要将当前旋转存储在例如a旋转
中,其中x值是Z轴周围的当前旋转,y值是x轴周围的旋转Vector2
- 您可以使用带有自定义轴的
,该轴用于构建setToRotation
值的组合phoneAccel
setToRotation
方法允许您定义Vector3方向
和Vector3面
,定义哪个面应朝向该方向。
例如:
modelInstance.transform.setToRotation(Vector3.Z,Vector3.Y)
将使他的上衣看起来不是Z方向。用矢量3(0,-1,0)
他的屁股(可能是脚)会朝那个方向看
希望它是清楚的谢谢
setFromEulerAngles
是我想要的。你知道这种计算在幕后是否有任何开销,比如任何sqrt函数吗?没有sqrt,但涉及到一些sin和cos调用(这几乎总是在通过角度设置旋转时)。实际上,这是一个很小的问题。这只适用于旋转,但如果我想移动对象(平移),这不起作用。但是,可能还有一个单独的问题,我使用的是setFromEulerAngles()
,然后是transform.translate(x,y,z)
,它不起作用(没有翻译)。如果我在旋转之前进行平移,那么模型会旋转,但会围绕不同的原点使用modelInstance.transform.setFromEulerAngles(偏航、俯仰、滚动).trn(x、y、z)代码>感谢您的输入。我使用了setFromEulerAngles
作为解决方案。@Jammo是的,在你的例子中,这是一个很好的解决方案。我不记得了。我只记得带两个向量的设置旋转
,因为我需要它,因为我有一个给定的方向
向量。