我在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轴如何,当鼠标向下移动时鼠标上下移动时相机会抬起来?
答案 0 :(得分:2)
看来你的转换顺序有问题。与数字乘法不同,matrix multiplication is not commutative。 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
)更改一个操作的顺序会以有趣和无耻的方式更改所有后续指令。
您正在制作的是相机,因此我强烈推荐reading how to build one。
理解矩阵变换的一个很好的练习是建造一个太阳系,包括轨道卫星和旋转行星。这将是一个大开眼界,非常有用。