通用简单3D矩阵旋转问题
我的3D对象上的旋转有问题(它在java中但它并不重要)
的背景:
我有一个简单的3D模型,你是它上面的第一人称游戏,你向上移动鼠标向上移动(IE按3D的x轴旋转)并向下移动鼠标向下看(向相反方向旋转)
但:
我还有左右箭头键左/右转动(旋转3D的y轴)
现在问题是,当我转动时,当我按x轴旋转时,它不再按预期转动,即如果你转动180度,通过向下移动鼠标实际上是向上看,如果你向上移动鼠标,你实际上看起来下。
我可以在x / y轴上执行什么旋转来修复此问题?
– 无论我转动了多少/一点点,向上移动鼠标都会向上移动,向下移动鼠标会向下看。
对不起,我无法更好地解释,但如果您需要更多信息,请发表评论。
非常感谢,
这可能是一个简单的转变,但我想不到:(
一些Java旋转代码:
鼠标向上/向下:
public void rotateXY(double radians, double Yradians) { vpTrans.getTransform(T3D); Transform3D test = new Transform3D(); Transform3D testX = new Transform3D(); Transform3D testY = new Transform3D(); translate.set(lastXcord, lastYcord, lastZcord); testX.rotX(radians); testY.rotY(Yradians); test.mul(testX, testY); test.setTranslation(translate); vpTrans.setTransform(test); //System.out.println(test); } // end of rotateXY()
左:(右边是相似但在角度变化时使用减号而不是加号)
public void run() { Transform3D test = new Transform3D(); Transform3D rotX = new Transform3D(); Transform3D rotY = new Transform3D(); vpTrans.getTransform(T3D); translate.set(lastXcord, lastYcord, lastZcord); angle += 0.05; trueangle += 0.05; rotX.rotX(angle); rotY.rotY(Yangle); test.mul(rotX, rotY); test.setTranslation(translate); vpTrans.setTransform(test); }
我需要添加哪些变换/旋转,所以无论我的y轴如何,当鼠标向下移动时鼠标上下移动时相机会向上看?
看来你的转换顺序有问题。 与数值乘法不同, 矩阵乘法不是可交换的 。 3D应用程序对转换顺序非常敏感。
用英语讲:
如果x
和y
是数字,那么x * y
= y * x
但是,如果x
和y
是矩阵 ,那么x * y
≠ y * x
!
考虑到这一点,让我们来看看你在做什么。
test.mul(rotX, rotY);
为了想象这个乘法运动发生了什么,想象一下你脑子里有一条直线。 我们称之为LineUp
。 现在小看你的键盘,想象一下LineUp
和你一起倾斜。 现在在LineUp
上将头转90度。 这就是你的旋转矩阵发生的事情。 疯了吧?
现在让我们像这样反转乘法: test.mul(rotY, rotX);
所以直接坐下来向前看,然后转动头部/身体/椅子。 现在往下看。 您首先在真正的LineUp
轴上旋转,然后应用向上/向下转换。 好玩呀?
考虑矩阵变换的好方法就像一个必须按顺序排列的指令集。
- 向右转。 (
rotY
) - 转过头来。 (
rotX
) - 移动到电脑(
translate
) - …等等
更改一个操作的顺序会以有趣和令人发指的方式更改所有后续指令。
你正在构建的是一个相机,所以我强烈建议你阅读如何构建一个相机。
理解矩阵变换的一个很好的练习是建造一个太阳系,包括轨道卫星和旋转行星。 这将是大开眼界,非常有用。