Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通用简单三维矩阵旋转问题_Java_Vector_3d_Matrix_Rotation - Fatal编程技术网

Java 通用简单三维矩阵旋转问题

Java 通用简单三维矩阵旋转问题,java,vector,3d,matrix,rotation,Java,Vector,3d,Matrix,Rotation,我在3D对象上的旋转有问题(用java实现,但这并不重要) 背景: 我有一个简单的3d模型,你是它的第一人称玩家,你可以向上移动鼠标来查看(即通过3d的x轴旋转),向下移动鼠标来查看(以相反方向旋转) 但是: 我还有左右箭头键来向左/向右旋转(旋转3D的y轴) 现在的问题是,当我旋转时,当我按x轴旋转时,它不再像预期的那样旋转,也就是说,如果你旋转180度,向下移动鼠标,你实际上会向上看,如果你向上移动鼠标,你实际上会向下看 我可以在x/y轴上执行什么旋转来修复此问题 -所以,无论我转动了多少次

我在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()
左图:(右图很相似,但角度变化时用负号代替正号)


我需要添加哪些变换/旋转,这样无论我的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);
    }