我有一个非常简单的 3D 场景 - 单个对象位于坐标中心的中间。不旋转,不平移。 IE。放在某张桌子上的手表。相机正对着它,直视它。到目前为止,一切都显示得很好。
现在,我尝试完成的是读取手机传感器以旋转设备并根据这些值围绕对象旋转相机。我正在阅读这些值,例如:
float xRotation = Gdx.input.getAccelerometerX()*9;
float yRotation = Gdx.input.getAccelerometerY()*9;
而且我的值还可以。 xRotation 是设备向左/向右旋转的值和向上/向下旋转的 yRotation。
然后我使用这些值围绕对象旋转相机。由于我不知道如何读取当前的摄像机角度,因此我正在保存它,每次更改旋转时,我首先通过保存的值进行负旋转,然后进行新的旋转。这也很好用:
float currentAngle = cameraYAngle + (angle - cameraYAngle) * (Gdx.graphics.getDeltaTime()*5);
cam.rotateAround(target, Vector3.X, -cameraYAngle); // returning camera back to 0 angle
cameraYAngle = currentAngle; // saving new angle
cam.rotateAround(target, Vector3.X, currentAngle); // setting new angle
所以我有点放慢动作以避免抽搐(对于这个问题可以忽略)。类似的代码适用于第二 (Z) 轴。所以旋转就像这样工作得很好,除了一部分:
如果我在圆圈中移动设备(例如,手机是激光指示器,并且我正在某些墙上画圆圈),如果我顺时针进行,我会在一个方向上围绕第三轴旋转?!?如果我以逆时针方向执行此操作,我会在其他方向获得第三个轴旋转?!?
所以我围绕 X 轴进行旋转以进行上/下旋转,并围绕 Z 轴进行左/右旋转。我不会在任何时候绕 Y 轴旋转,但是这两个的组合也会以某种方式影响绕 Y 轴的旋转?!?
也就是说,如果相机围绕 X 旋转,然后围绕 Z 旋转,也会以某种方式围绕 Y 轴旋转。当我旋转回(通过使用保存的值)到我没有做的 0,0 旋转时,围绕 Y 轴保持不变。
我感觉这不是编码问题,但我不完全理解 3D 旋转是如何进行的。
答案 0 :(得分:0)
好的,找到了解决该行为的方法。我的每一个新框架:
恢复 Z 轴旋转 -> 进行新的 Z 轴旋转 -> 恢复 X 轴旋转 -> 进行新的 X 轴旋转
所以我进行了还原、旋转、还原、旋转,每当我进行新的旋转时,已经应用了其他方法。
现在我改成:
反转Z旋转,反转X旋转,进行X旋转,进行Z旋转
因此,如果我以与旋转相反的顺序向后旋转,则效果很好。开始时重置 2 次后,每帧我都会回到 0,0,0。
我假设如果按轴恢复旋转的值相同,我会得到原始的 0,0,0 位置,但事实并非如此。应用轮换的顺序也很重要。