【问题标题】:Generic Simple 3D Matrix Rotation Issue通用简单 3D 矩阵旋转问题
【发布时间】:2011-12-07 01:08:11
【问题描述】:

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

【问题讨论】:

  • 我可能在某些时候在解释中混淆了 X/Y 轴,但希望你能明白!

标签: java vector 3d matrix rotation


【解决方案1】:

您的转换顺序似乎有问题。与数值乘法不同,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. ...等

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

你正在构建的是一个相机,所以我强烈推荐reading how to build one

了解矩阵变换的一个很好的练习是建立一个太阳系,其中包括绕轨道运行的卫星和旋转的行星。它会让人大开眼界,而且信息量很大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多