Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx如何使用手机方向在多个轴上旋转三维模型_Java_Android_Matrix_3d_Libgdx - Fatal编程技术网

Java Libgdx如何使用手机方向在多个轴上旋转三维模型

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

我正在尝试使用手机的加速计同时在多个轴上旋转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

在上面的示例中,两行代码都可以正常工作,但只能独立工作。当我尝试使用这两个(一个接一个)时,第一个旋转(滚动)被移除。我原以为这两个旋转矩阵会累加起来,也就是说,Z轴被应用一个旋转,然后X轴被应用一个旋转

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

有什么想法吗?Cheers

Matrix4#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
    Vector2
    中,其中x值是Z轴周围的当前旋转,y值是x轴周围的旋转
  • 您可以使用带有自定义轴的
    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是的,在你的例子中,这是一个很好的解决方案。我不记得了。我只记得带两个向量的
设置旋转
,因为我需要它,因为我有一个给定的
方向
向量。