通用简单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应用程序对转换顺序非常敏感。

用英语讲:

如果xy是数字,那么x * y = y * x

但是,如果xy矩阵 ,那么x * y y * x

考虑到这一点,让我们来看看你在做什么。

test.mul(rotX, rotY);

为了想象这个乘法运动发生了什么,想象一下你脑子里有一条直线。 我们称之为LineUp 。 现在小看你的键盘,想象一下LineUp和你一起倾斜。 现在在LineUp上将头转90度。 这就是你的旋转矩阵发生的事情。 疯了吧?

现在让我们像这样反转乘法: test.mul(rotY, rotX);

所以直接坐下来向前看,然后转动头部/身体/椅子。 现在往下看。 您首先在真正的LineUp轴上旋转,然后应用向上/向下转换。 好玩呀?

考虑矩阵变换的好方法就像一个必须按顺序排列的指令集。

  1. 向右转。 ( rotY
  2. 转过头来。 ( rotX
  3. 移动到电脑( translate
  4. …等等

更改一个操作的顺序会以有趣和令人发指的方式更改所有后续指令。

你正在构建的是一个相机,所以我强烈建议你阅读如何构建一个相机。

理解矩阵变换的一个很好的练习是建造一个太阳系,包括轨道卫星和旋转行星。 这将是大开眼界,非常有用。