3d - 绕 X 轴和 Z 轴旋转也会导致绕 Y 轴旋转?
问题描述
我有一个非常简单的 3D 场景 - 单个对象位于坐标中心的中间。不旋转,不平移。即放在某张桌子上的手表。相机就在它上面,直视着它。到目前为止,一切都显示得很好。
现在,我尝试完成的是读取用于旋转设备的手机传感器并根据这些值围绕对象旋转相机。我正在阅读这些值,例如:
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) 轴。所以旋转像这样工作得很好,除了一个部分:
如果我在圆圈中移动设备(例如,手机是激光笔,我在墙上画圆圈)如果我顺时针方向旋转,我会在一个方向上绕第三轴旋转?!?如果我以逆时针方向执行此操作,我会在其他方向获得第 3 轴旋转?!?
所以我围绕 X 轴进行旋转以进行向上/向下旋转,并围绕 Z 轴进行向左/向右旋转。我不会在任何时候围绕 Y 轴旋转,但是这两个的组合也会以某种方式影响围绕 Y 轴的旋转?!?
也就是说,如果相机绕即X 旋转,然后绕Z 旋转,也会以某种方式绕Y 轴旋转。当我旋转回(通过使用保存的值)到我没有进行的 0,0 旋转时,围绕 Y 轴保持不变。
我觉得这不是编码问题,而是我不完全理解 3D 旋转是如何制作的。
解决方案
好的,找到了解决该行为的方法。对于每一个新框架,我都是:
恢复 Z 旋转 -> 制作新的 Z 旋转 -> 恢复 X 旋转 -> 制作新的 X 旋转
因此,我进行了还原、旋转、还原、旋转,当我进行新的旋转时,其他的已经应用了。
现在我将其更改为:
恢复 Z 旋转,恢复 X 旋转,进行 X 旋转,进行 Z 旋转
因此,如果我以与旋转相反的顺序向后旋转,则效果很好。在开始时重置 2 次后,每帧我回到 0,0,0。
我假设如果按轴恢复旋转的值相同,我将获得原始的 0,0,0 位置,但事实并非如此。应用轮换的顺序也很重要。
推荐阅读
- c - 如何用一个字符替换两个字符?
- sql - Sql ER图:产品与父母关系
- python - 如何使用python获得给定显着性水平的拒绝区域
- excel - 使用 VBA 自动过滤列时如何仅包含特定单词
- c - 检查用户是否根据格式输入
- python - TensorFlow:设计自定义层时 __call__() 和 call() 的功能之间的区别?
- c++ - 为什么函数二返回 cout << s << " " << t << " " << b << endl; 当它说只返回(b)时?
- python - 如何解决 FieldError - 无法将关键字“slug”解析为字段
- mysql - DUPLICATE KEY UPDATE 只能工作一次?
- android - 为什么我的搜索栏没有隐藏提示“搜索...”?