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

时间:2011-12-07 01:08:12

标签: java vector 3d matrix rotation

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

1 个答案:

答案 0 :(得分:2)

看来你的转换顺序有问题。与数字乘法不同,matrix multiplication is not commutative。 3D应用程序对转换顺序非常敏感。

英文:

如果xy是数字,那么x * y = y * x

但是,如果xy矩阵,那么x * y y * x

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

  

test.mul(rotX, rotY);

想象一下这个乘法运动会发生什么,想象一下你脑子里有一条直线。我们称之为LineUp。现在向下看你的键盘,想象LineUp与你倾斜。现在把你的头转到LineUp上90度。这就是您的旋转矩阵发生的事情。疯了吧?

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

所以直接站起来向前看,然后转动头部/身体/椅子。现在往下看。您首先在真正的LineUp轴上旋转,然后应用向上/向下转换。好玩,是吗?

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

  1. 向右转。 (rotY
  2. 抬起头。 (rotX
  3. 转到计算机(translate
  4. ...等
  5. 更改一个操作的顺序会以有趣和无耻的方式更改所有后续指令。

    您正在制作的是相机,因此我强烈推荐reading how to build one

    理解矩阵变换的一个很好的练习是建造一个太阳系,包括轨道卫星和旋转行星。这将是一个大开眼界,非常有用。