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

2024-01-03

我的 3D 对象旋转有问题(它是用 java 编写的,但这并不重要)

的背景:

我有一个简单的 3D 模型,您是其中的第一人称玩家,您向上移动鼠标以向上看(即按 3D 的 x 轴旋转),向下移动鼠标以向下看(沿相反方向旋转)

But:

我还有左、右箭头键来左/右转动(旋转 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 轴如何,当鼠标上下移动时相机都会向上查找,当鼠标向下移动时相机都会向上查找?


您似乎对转换顺序有问题。与数值乘法不同的是,矩阵乘法不可交换 http://en.wikipedia.org/wiki/Commutative_property#Noncommutative_operations_in_mathematics。 3D 应用程序对变换的顺序非常敏感。

用英语讲:

if x and y是数字,那么x * y = y * x

然而,如果x and y are matrices, then x * y y * x!

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

test.mul(rotX, rotY);

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

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

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

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

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

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

你正在构建的是一个相机,所以我强烈推荐阅读如何构建一个 http://www.cubic.org/docs/camera.htm.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通用简单 3D 矩阵旋转问题 的相关文章

随机推荐

  • 如何从 Rails 中的哈希列表中删除嵌套键

    我现在正在尝试几个小时来删除哈希列表的嵌套哈希键 我看到许多解决方案非嵌套哈希 如下所示 sample hash key1 gt value1 key2 gt value2 sample hash except key1 这导致 key2
  • 使用 web api HttpResponseMessage 输出图像

    我正在尝试使用以下代码从 asp net web api 输出图像 但响应正文长度始终为 0 public HttpResponseMessage GetImage HttpResponseMessage response new Http
  • Python对不同维度变量进行曲面拟合得到未知参数?

    我有一个包含 x 和 y 作为自变量的函数 我想将参数拟合到数据和函数并绘制曲面图 我看到如果变量有两个不同的维度 我可以使用np meshgrid x y 那么我如何找到参数a b c呢 我的代码如下所示 import matplotli
  • Python 中的分块矩阵赋值

    从这个mwe a np zeros 5 5 b np zeros 2 2 a np matrix a b np matrix b b 0 0 4 b 1 1 9 b 0 1 7 indice 2 3 1 c a indice indice
  • 领域逻辑与数据验证

    我正在忙着阅读并享受 Mark Seemann 所著的 Net 中的依赖注入 我很难解释确切的上下文 所以如果你熟悉这本书 请只关心这个问题 我的问题与第 2 章第 49 页中的两个 Product 类有关 其中一个位于域层 一个位于数据访
  • jquery 绑定多个锚点

    我想将相同的事件绑定到锚链接列表 为什么这不起作用 Markup a href contactRoles class fg button fg button icon right ui widget ui state default ui
  • 如何防止 R 显示 exp 和 log 值 inf 和零

    我将计算矩阵正态密度以在对数似然公式中使用它们 在我的计算中 我需要计算大数 数千万 的指数 我意识到 当 i gt 710 时 R 会返回 exp i 的无穷大 无论如何 我可以手动强制 R 不显示无穷大 或者其日志不相应地为 0 吗 感
  • 查找元素更改值的索引 pandas dataframe

    关于这个问题 答案 https stackoverflow com questions 19125661 find index where elements change value numpy 有没有一种方法可以为 pandas 数据帧结
  • 进度条适用于 Android API 23,但不适用于 21 或 22

    这是 xml 部分
  • 重新发明标签控件

    我需要从头开始重新发明 重新创建标签控件 以添加我自己的魔力 是的 我知道你在想什么 如果你不这么想 你不应该这样想吗 有人能指出我正确的方向吗 谢谢 重新创建标签的全部目的是我想要完全控制它如何绘制到屏幕上 这样我也可以拥有它的 KeyD
  • ILMerge 问题错误代码 1

    我知道 ilmerge 是一个控制台应用程序 但当我运行它时 它运行一秒钟然后关闭 下面是我尝试使用的预构建代码 它给出了这个问题 Error 1 The command ilmerge out F Users Tom Desktop Ne
  • Cocoa osx NSTableview 改变行高亮颜色

    在我的应用程序中 我有一个基于视图的 NSTableView 其中有一列 行的突出显示颜色设置为常规 蓝色 我需要将该颜色更改为我的自定义颜色 在界面生成器中 我尝试更改它 但唯一的选项是 无 常规和源列表 我尝试了这个帖子解决方案但没有成
  • 将算法从 C# 转换为 VB.NET 失败

    我正在尝试将以下算法从 C 转换为 VB NET 但我所拥有的 VB NET 生成的结果与我的 C 算法不同 有人可以告诉我在转换过程中哪里出了问题吗 public static IEnumerable
  • Makie:散点图的非重叠标签放置算法

    我使用 CairoMakie 散点图 XY 数据集 但使用标签作为标记 using CairoMakie x 0 0 5 0 50 y 0 0 5 0 51 lbls O A B fig Figure ax Axis fig 1 1 sca
  • 如何在 Ubuntu 15.10 中将 Robomongo 从 tar.gz 文件安装为程序

    如今 robomongo 开发人员发布了 robomongo 的新版本tar gz not in deb易于双击安装的软件包 但该选项不再可用 那么如何将其安装为Ubuntu中的程序 我尝试解压软件包并安装但失败 admin admin l
  • 该代理的会话已存在

    我正在使用 TFS 执行夜间构建 其中包括使用TFS测试代理 https www visualstudio com en us docs test lab management test machines install configure
  • 使用 Java 将宏添加到 Excel 电子表格

    我正在开发一个创建 Excel 电子表格的应用程序 我正在使用 Javadocx4j http dev plutext org trac docx4j库 但它没有宏支持 因为它不是通过 Open XML API 提供的 我只是想知道是否有人
  • 带有可选参数的智能 URL?

    我目前在我的 htaccess 文件中包含以下内容 RewriteEngine On RewriteBase RewriteCond REQUEST FILENAME f RewriteCond REQUEST FILENAME l Rew
  • 将不同的嵌入结构投影到相同的名称

    我正在编写一个执行这些任务的 python 脚本 查询带有嵌入文档的 MongoDB 集合 聚合和项目更改查询中返回的字段名称以匹配 u 约定 通过 REST API 将值导入到 ServiceNow ISSUE 嵌入的文档结构不一致 HO
  • 通用简单 3D 矩阵旋转问题

    我的 3D 对象旋转有问题 它是用 java 编写的 但这并不重要 的背景 我有一个简单的 3D 模型 您是其中的第一人称玩家 您向上移动鼠标以向上看 即按 3D 的 x 轴旋转 向下移动鼠标以向下看 沿相反方向旋转 But 我还有左 右箭