问题标签 [quaternions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 四元数的标准位置?
在 2D 中,向量的标准位置在 X 轴正方向下方。四元数有等效的位置吗?
math - 四元数旋转矩阵竟然有相反的意义
我对四元数有一些理解问题。
为了让我的世界对象以正确的方式旋转,我需要在刷新对象世界矩阵的同时反转它们的四元数旋转。
我使用以下代码创建对象旋转:
并像这样刷新对象 World 矩阵:
这是行不通的;与应有的方式相比,它使对象以相反的方式旋转!
这是使我的对象正确旋转的方式:
为什么我必须反转对象旋转?
opengl - 具有 3 个向量的 OpenGL 相机
好的,所以我按照本教程帮助我在 OpenGL 中制作相机:http: //nehe.gamedev.net/data/articles/article.asp ?article=08
所以我跟着它,经过一番挣扎,终于有了一个解决方案,我现在有 3 个向量代表我的相机的 3 个轴。
问题呢?我不知道如何使用这些信息来实际获得正确的旋转/翻译!我尝试使用 gluLookAt,将相机的位置用作第一个参数,然后将相机的 Z 轴用作目标,将 Y 轴用作向上参数。结果是,无论我向上/向下/向左/向右移动,相机都不会停止注视一个点,并且旋转的行为更加奇怪......
我采取了完全错误的方法吗?我考虑过使用四元数以某种方式计算我需要的转换,但无法弄清楚如何获得我需要的参数/如何开始......基本上我只想要一个简单的类似 FPS 的相机开始,在那里我可以四处移动,向上/向下和向侧面看(以前我大部分时间都在工作,除了向上看然后转身时,旋转搞砸了......)
一般或具体的帮助将不胜感激!因为我已经为此工作了好几个小时,但情况并没有好转……
总而言之……我需要帮助制作一个可以偏航/俯仰/滚动的相机……而不是盯着一个点。
编辑:好的,所以,显然以正确的顺序旋转真的可以帮上忙!傻我。无论如何,我仍然很想知道如何使用相机的三个轴来形成四元数来进行转换。
3d - 将 3d 角度分成相等的数量
假设您有一个 2d 对象,您可以轻松地将其划分为 15 度旋转,只需围绕中心以 15 度增量旋转即可。
如果我想为一个 3d 对象计算所有可能的角度,每个角度之间的间距相等,我将如何去做。
尽管为每个执行 p*r*y 会起作用,但它会相当随意并且有大量的重叠。我也非常想要一个四元数解决方案。
我正在为我目前正在开发的一个视频游戏项目做这个,本质上是一个老式的飞行模拟,虽然游戏中的 3d 被渲染为 2d 精灵。我正在寻找一种简单的方法来渲染我的飞机模型的所有可能的角度,其中包括每个正交的等间距角度。
3d - 简单的 3D 投影和方向处理?
我目前正在制作一个古怪的复古飞行模拟游戏,我的 3d 项目遇到了一些问题,因为我找不到任何关于该主题的可靠通用文档。
在给出以下信息的情况下,如何将我的游戏世界中的简单位置矢量转换为屏幕上的二维矢量:
摄像头定位 摄像头方向(见下文) 视野 屏幕高度和宽度(以及纵横比)
我也在寻找一种存储方向的方法,我已经编写了一个基本的向量库,但我不确定如何存储旋转以供相机(和投影代码)使用以及旋转的实际处理游戏中的对象。我目前正在考虑使用四元数,但是否可以(并且很容易)使用四元数而不是矩阵进行投影转换?
代码中的实现四元数有什么好的来源吗?我必须为复数编写一个单独的库吗?
感谢您的时间和任何帮助:)
java - LWJGL - 使用四元数和平移矩阵在 6DOF 相机中实现“滚动”的问题
我在这个问题上花了几个星期,似乎找不到合适的解决方案,需要一些建议。
我正在使用 LWJGL/Java 创建一个 Camera 类,并使用四元数来处理方位(偏航)、俯仰和滚动旋转。我希望这台相机能够处理 3D 空间中的所有 6 度运动并滚动。轴承、俯仰和滚动都是四元数。我将它们乘以“变化”四元数,并从中创建一个平移矩阵。我把它放在一个浮点缓冲区中,并将模型视图矩阵乘以包含旋转矩阵的缓冲区。
我可以让轴承和俯仰旋转正常工作,但是当我实施滚动时,我遇到了问题。主要是,围绕 Z 轴旋转(滚动)似乎不起作用。当我“滚动”相机时,它似乎围绕全局 Z 轴而不是本地相机方向轴滚动。根据我乘以四元数的顺序,我通常可以让 3 个中的 2 个工作,但我不能让它们一起工作。
由于它们都是独立工作的,我假设我的定向方法有问题,我将它们组合并构建一个旋转矩阵。我在粘贴整个类时遇到问题,所以这里是与轮换相关的方法和声明:
...
Vector3f、Quaternion 和 Matrix4f 都是 LWJGL 类,不是定制的。
所以我的问题是,给定代表轴承、俯仰和滚动的 3 个四元数,我如何修改 ModelView 矩阵以准确表示这些旋转?
编辑:我觉得这非常接近。请参阅 RiverC 评论中的要点链接。在旋转了这么多度之后,视图在滚动时恢复正常之前跳了很多。它的要点在那里,但它仍然略微偏离。
java - 基于鼠标移动的旋转四元数(OpenGL 和 Java)
我正在使用 OpenGL(具体来说是 LWJGL 绑定)用 Java 编写游戏。每个实体,包括相机,都有一个代表它的旋转的四元数。我已经想出了如何将四元数应用于当前的 OpenGL 矩阵并且一切都旋转得很好。我遇到的问题是让相机随鼠标旋转。
现在,每一帧,游戏都会抓取鼠标在一个轴上移动的量,然后将这个量应用到四元数上以进行相机旋转。这是旋转四元数的代码,我会发布它,因为我认为这是问题所在(尽管我对这类东西总是错的):
该方法应该围绕 X 轴旋转四元数。'rotation' 是代表实体旋转的四元数。“数量”是我想要旋转四元数的数量(也就是鼠标移动的数量)。'rot' 是沿 X 轴的归一化向量,其 aw 值转换为弧度(我想这里的目标是给它一个角度 - 比如 10 度 - 并让它沿着给定轴旋转四元数角度)。使用 Quaternion.mul 获取新的四元数,将其乘以旋转四元数,然后将结果存储为旋转四元数。我不知道标准化是否必要,因为“rot”是正常的,“rotation”应该已经标准化了。
rotateY 和 rotateZ 方法做同样的事情,除了改变 'rot' 的向量(y 为 0.0, 1.0, 0.0 和 z 为 0.0, 0.0, 1.0)。
当游戏开始并且相机向下看负 Z 轴时,代码似乎可以正常工作。您可以在 Y 轴上一直旋转或一直围绕 X 轴旋转。但是,一旦您尝试在不向下看 Z 轴的情况下旋转相机,一切都会变得非常糟糕(我什至无法描述它,它的旋转非常奇怪)。
我的最终目标是在没有向上矢量的空间中控制一艘船。因此,当您在 Y 轴上移动鼠标时,无论船处于什么角度,它都会改变船的俯仰角(沿 X 轴旋转)。同样,当您在 X 轴上移动鼠标时,它会改变偏航角(沿 Y 轴的旋转)。我可能会以错误的方式解决这个问题,我可能只需要朝着正确的方向推动(或推动)。
如果您需要有关任何事情的更多详细信息(我的渲染是如何完成的,我正在尝试做的任何其他数学运算)只要问我就会提出来。当我使用欧拉角时,我明白了一切(这显然是 3D 应用程序开发的一大禁忌……希望有人能在我花很多时间让它们工作之前告诉我),但只要我切换到四元数,我很快就进入了我的脑海。在过去的几个月里,我一直在玩这个代码并阅读四元数试图让它工作,但我还没有真正得到任何地方:'(
非常非常令人沮丧...开始后悔尝试用 3D 制作东西>_<
c# - 旋转块的 6 个边
我一直在关注 The Hazy Mind 的 XNA 教程我有一个基础对象,它有一个位置(Vector3)和一个旋转(四元数)。对象模型如下所示
从教程中的相机实现中,我复制了 Rotation 和 Revolve 方法并在 Object 上实现了它们
我的 Block 对象创建了 6 个 Quad 实例并在每个 Quad 对象上调用 render 方法,我在每个 Quad 上分配了偏移和旋转,以形成如下所示的纹理块:
现在我们遇到了实际问题,在我的 Block 对象上调用 Rotate 会导致对象本身改变旋转,而我的 Quad 对象不会旋转,因此我在 Block 对象上实现了一个新的 Rotate 函数。
然而,这并没有给我预期的结果,如下所示:
错误的解决方案
以下解决方案将起作用,但不会很通用并且会受到限制:一堆 if 语句检查我想要围绕哪个轴旋转,然后以正确的方式旋转每一侧(Quad 对象)。
正确的解决方案
或者,我可以根据块对象(它们的父对象)的旋转来渲染 Quad 对象,但我不确定如何执行此操作。
第三个也是最后一个选项是让 Rotate 方法将每个 Quad 对象的旋转和位置更新为正确的值,我也不确定如何做。
问题
所以我要求的是对此的一些想法或想法,也许是一些链接和/或教程,解释如何在 XNA 中使用四元数,最好以视觉方式。
干杯,期待您的意见:)
c++ - 从四元数到 OpenGL 旋转
我有一个我想通过键旋转的对象。物体应该偏航、俯仰和滚动。在尝试了很多之后,我发现它glRotate
有其局限性,并且不可能用该功能实现类似的东西。
我研究了一下,发现了基于四元数的旋转。也可以通过旋转矩阵进行旋转,但几乎每个人都将四元数描述为有史以来最好的。
我已经阅读了四元数并很好地理解了它们,但是如何在我的 OpenGL 程序中实现它们仍然是一个谜。有谁知道一个小例子?不是如何实现四元数类,而是如何使用它。我不明白如何把这些东西放在一起。
c++ - 四元数的旋转不太正确
继我之前的问题之后,我现在已经设法用四元数旋转我的对象,但仍然存在一个小问题,我不知道如何解决它。使用下面的代码,我的对象围绕 x 和 y 轴旋转。但是当我在 x 键和 y 键之间切换时,它总是跳回初始位置。所以我从来没有从新位置得到轮换,但总是从程序开始的那个位置轮换。
我希望你明白我的意思。