小编典典

通用简单3D矩阵旋转问题

java

我在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轴如何,当鼠标上下移动时,相机都会向上看;当鼠标向下移动时,相机会向上看?


阅读 249

收藏
2020-11-30

共1个答案

小编典典

您似乎对转换顺序有疑问。与数值乘法不同,矩阵乘法不是可交换的。3D应用程序对转换顺序非常敏感。

用英语讲:

如果xy是数字,则x * y=y * x

但是,如果xy矩阵 ,则x * y y * x

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

test.mul(rotX, rotY);

为了可视化此乘法发生的情况,想象一下您的脑海中出现了一条直线。我们称这个为LineUp。现在,低头看着键盘,想象一下LineUp与您一起倾斜。现在将头旋转90度LineUp。那就是你的旋转矩阵正在发生的事情。疯了吧?

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

因此,坐直并向前看,然后转头/身体/椅子。现在往下看。LineUp首先在真实轴上旋转,然后应用上/下变换。好玩吗

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

  1. 向右转。(rotY
  2. 抬头 (rotX
  3. 移至计算机(translate
  4. …等等

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

您要构建的是一台相机,因此我强烈建议您阅读如何构建相机。

理解矩阵变换的一项重要工作是建立一个太阳系,其中包括绕月运行的卫星和旋转的行星。这将是令人大开眼界并且非常有用的内容。

2020-11-30