我在3D对象上旋转时遇到问题(在Java中,但这并不重要)
背景:
我有一个简单的3d模型,您是第一人称视角的游戏者,您将鼠标向上移动以向上看(即,通过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
但是,如果x和y是 矩阵 ,则x * y ≠ y * x!
考虑到这一点,让我们看看您在做什么。
test.mul(rotX, rotY);
为了可视化此乘法发生的情况,想象一下您的脑海中出现了一条直线。我们称这个为LineUp。现在,低头看着键盘,想象一下LineUp与您一起倾斜。现在将头旋转90度LineUp。那就是你的旋转矩阵正在发生的事情。疯了吧?
LineUp
现在让我们像这样反转乘法: test.mul(rotY, rotX);
test.mul(rotY, rotX);
因此,坐直并向前看,然后转头/身体/椅子。现在往下看。LineUp首先在真实轴上旋转,然后应用上/下变换。好玩吗
考虑矩阵变换的一种好方法就像必须按顺序排列的指令集。
rotY
rotX
translate
更改一个操作的顺序会以滑稽和令人发指的方式更改所有后续指令。
您要构建的是一台相机,因此我强烈建议您阅读如何构建相机。
理解矩阵变换的一项重要工作是建立一个太阳系,其中包括绕月运行的卫星和旋转的行星。这将是令人大开眼界并且非常有用的内容。