gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:04:18 25 4
gpt4 key购买 nike

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

最佳答案

您的转换顺序似乎有问题。与数值乘法不同,matrix multiplication is not commutative 。 3D 应用程序对变换的顺序非常敏感。

英文:

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

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

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

test.mul(rotX, rotY);

为了形象化这个乘法所发生的情况,想象一下你的头脑中有一条直线。我们称之为LineUp 。现在低头看看你的键盘,想象一下LineUp与你一起倾斜。现在将头转向 90 度 LineUp 。这就是你的旋转矩阵所发生的情况。疯了吧?

现在让我们反转乘法,如下所示:test.mul(rotY, rotX);

所以坐直并向前看,然后转动你的头/ body /椅子。现在稍微往下看。你旋转了一个真正的LineUp首先轴,然后应用上/下变换。有趣吗?

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

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

改变一个操作的顺序会以一种有趣又令人震惊的方式改变所有后续的指令。

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

理解矩阵变换的一个很好的练习是构建一个太阳系,其中包含绕轨道运行的卫星和旋转的行星。这将令人大开眼界并且信息丰富。

关于java - 通用简单 3D 矩阵旋转问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com