Java 通用简单三维矩阵旋转问题
我在3D对象上的旋转有问题(用java实现,但这并不重要) 背景: 我有一个简单的3d模型,你是它的第一人称玩家,你可以向上移动鼠标来查看(即通过3d的x轴旋转),向下移动鼠标来查看(以相反方向旋转) 但是: 我还有左右箭头键来向左/向右旋转(旋转3D的y轴) 现在的问题是,当我旋转时,当我按x轴旋转时,它不再像预期的那样旋转,也就是说,如果你旋转180度,向下移动鼠标,你实际上会向上看,如果你向上移动鼠标,你实际上会向下看 我可以在x/y轴上执行什么旋转来修复此问题 -所以,无论我转动了多少次,向上移动鼠标会向上看,向下移动鼠标会向下看 对不起,我无法更好地解释,但如果你需要更多信息,请发表评论 非常感谢 这可能是一个简单的转换,但我不认为:( 一些Java代码: 上/下鼠标:Java 通用简单三维矩阵旋转问题,java,vector,3d,matrix,rotation,Java,Vector,3d,Matrix,Rotation,我在3D对象上的旋转有问题(用java实现,但这并不重要) 背景: 我有一个简单的3d模型,你是它的第一人称玩家,你可以向上移动鼠标来查看(即通过3d的x轴旋转),向下移动鼠标来查看(以相反方向旋转) 但是: 我还有左右箭头键来向左/向右旋转(旋转3D的y轴) 现在的问题是,当我旋转时,当我按x轴旋转时,它不再像预期的那样旋转,也就是说,如果你旋转180度,向下移动鼠标,你实际上会向上看,如果你向上移动鼠标,你实际上会向下看 我可以在x/y轴上执行什么旋转来修复此问题 -所以,无论我转动了多少次
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()
左图:(右图很相似,但角度变化时用负号代替正号)
我需要添加哪些变换/旋转,这样无论我的y轴如何,当鼠标上下移动时相机都会向上看???看起来你对变换顺序有问题。与数字乘法不同,.3D应用程序对变换顺序非常敏感 英文: 如果
x
和y
是数字,则x*y
=y*x
但是,如果x
和y
是矩阵,则x*y
≠y*x
记住这一点,让我们看看你在做什么
test.mul(rotX,rotY);
想象一下这个乘法发生了什么,想象一下你的脑袋里有一条直线。我们称之为LineUp
。现在看看你的键盘,想象LineUp
和你一起倾斜。现在把头转90度。这就是你的旋转矩阵。疯了吗
现在让我们像这样反转乘法:test.mul(rotY,rotX);
所以,坐直,向前看,转动你的头/身体/椅子。现在往下看一点。你先在一个真正的排列
轴上旋转,然后应用上/下转换。有趣吗
思考矩阵变换的一个很好的方法就像是一个必须有序的指令集
rotY
)rotX
)翻译
)理解矩阵变换的一个很好的练习是建立一个太阳系,包括绕轨道运行的卫星和旋转的行星。这会让人大开眼界,而且信息量很大。我可能在某个时候在解释中混淆了X/Y轴,但你希望能理解这个想法!!
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);
}