“单元”四元数和“身份”四元数有什么区别

问题描述 投票:-1回答:1

我一直在使用www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/上的指南来学习OpenGL。本指南说...

glm :: quat q;

...创建一个身份四元数(不旋转)。

实验表明,q = [0,0,0,0]。将其用作根骨骼的父级定向不会导致任何骨骼旋转。他们失去了所有的轮换。

指南说...

四元数是一组由4个数字组成的集合[x y z w],它通过以下方式表示旋转:

// RotationAngle以弧度为单位

x = RotationAxis.x * sin(RotationAngle / 2)

y = RotationAxis.y * sin(RotationAngle / 2)

z = RotationAxis.z * sin(RotationAngle / 2)

w = cos(RotationAngle / 2)

...和...

[[0 0 0 1](w = 1)表示角度= 2 * acos(1)= 0,所以这是一个四元数,根本不旋转。

我一直在尝试一个骨骼系统,在该骨骼系统中,每个骨骼都先继承其父母的方向,然后再对其施加旋转。

如果我使用“ identity”四元数作为根骨骼的“父”方向,则根本不会旋转任何骨骼。如果我使用“单位”旋转,一切都很好。

当我将骨骼的初始方向设置为“ identity”或“ unit”四元数时,它会按照我的意愿显示。但是,当我将用户输入的欧拉角转换为方向时,我会旋转180度。我所做的转换是:

        glm::vec3 eulers(glm::radians(pose.lng_rotate),
                         glm::radians(pose.lat_rotate),
                         glm::radians(pose.att_rotate));

        pose.orientation = glm::quat(eulers);

注意:我在这里使用“ lng”,“ lat”和“ att”旋转,因为当骨骼继承父旋转时,“ x”轴可能不再是“ x”轴。

我注意到的最后一件奇怪的事情是,我在每种四元数类型上使用了glm::mat4_cast,然后乘以一个恒等式glm::vec4。 [identity]四元数使向量不旋转,但是“ unit”四元数使向量反转(乘以-1)向量的x和y分量。

我想更好地理解四元数,特别是关于它们在代码中的使用。

概念上,“单元”四元数与“身份”四元数有何不同?

我应该在哪里使用“单位”四元数,哪里应该使用“身份”四元数?

我只是被写得不好的指南所迷惑吗?

3d rotation
1个回答
0
投票

单元和标识四元数是同一件事。该指南写得很烂,令人困惑。

glm::quat q;执行NOT创建一个标识四元数。它创建一个无效的四元数。创建身份四元数的最佳方法是通过glm::quat q(glm::vec3(0.0, 0.0, 0.0));glm::quat q(1.0, 0.0, 0.0, 0.0);。第一个基于所有零欧拉旋转的矢量生成四元数。第二个将其显式初始化为标识四元数。

注意,尽管四元数通常被描述为[x y z w],但它们被存储并初始化为(w, x, y, z)

© www.soinside.com 2019 - 2024. All rights reserved.