当前位置: 首页 > 面试题库 >

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

司空思聪
2023-03-14
问题内容

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


问题答案:

您似乎对转换顺序有疑问。与数值乘法不同,矩阵乘法不是可交换的。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. …等等

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

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

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



 类似资料:
  • 假设我使用大小为8的字符数组来表示图像的碰撞掩码。字符的每一位代表一个像素。实际上,对于64x64矩阵,我将使用长[64]阵列。 因此,框将显示为: 45度的示例输出应该是这样的,尽管旋转可以是任何角度。这个形状对于45度旋转可能不准确,因为我是用手做的。 另一个例子是向右旋转10度?这些值可能是错误的,因为从数学上讲,我不知道它将如何精确旋转,但我认为可以安全地假设,如果每个位的覆盖率超过旧形状

  • 本文向大家介绍Python一行代码解决矩阵旋转的问题,包括了Python一行代码解决矩阵旋转的问题的使用技巧和注意事项,需要的朋友参考一下 今天刷《剑指offer》的时候碰到这样一道题: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,

  • 问题内容: 我需要能够设置矩阵的旋转而不是添加矩阵。我相信设置旋转度的唯一方法是知道矩阵的当前旋转度。 注意:不会这样做,因为矩阵需要保留其信息。 问题答案: 您可以做的就是调用并缓存值。稍后,当您希望它们返回时,只需调用矩阵即可。 更新资料 旋转矩阵和变换矩阵的关系在这里得到了很好的解释

  • 本文向大家介绍螺旋打印矩阵,包括了螺旋打印矩阵的使用技巧和注意事项,需要的朋友参考一下 该算法用于以螺旋方式打印数组元素。首先,从第一行开始,先打印全部内容,然后按照最后一列打印,然后再最后一行,依此类推,从而以螺旋方式打印元素。  该算法的时间复杂度为O(MN),M为行数,N为列数。 输入输出 算法 输入: 矩阵矩阵,行和列m和n。 输出:以螺旋方式打印矩阵的元素。 示例 输出结果

  • 我想用一个整数的方法打印一个螺旋矩阵。然而,我在纸上的代码运行得很好,但是当我运行时,我会得到不同的数字来代替我想要的数字。 在现实中,它应该打印如下内容 如果您能帮忙,我们将不胜感激。

  • 问题内容: 我正在使用阴影中的形状生成使用安装在移动平台上的相机拍摄的图像的数字地形模型(DTM)。用Python编写的算法似乎运行得很好,但是输出是倾斜的并且有点球形,所以我怀疑我需要从DTM中消除透视失真和桶形。 如果有人对此感兴趣,可以在这里获得数据。 摄像机以41度倾斜安装,并具有以下摄像机和失真矩阵: 如何应用透视变换并从此矩阵中消除桶形失真以获得平坦的DTM? 我已经尝试过使用Open