我在世界空间中有一些物体,让我们说(0,0,0)并想要将它旋转到面(10,10,10).
我如何使用四元数?
我一直在为即将到来的项目研究四元数,并遇到了一个我无法理解的概念问题。
四元数标准化的方法如下:
q_mag = sqrt(q0^2+q1^2+q2^2+q3^2)
q0 = q0/q_mag
q1 = q1/q_mag
q2 = q2/q_mag
q3 = q3/q_mag
Run Code Online (Sandbox Code Playgroud)
直接,就像标准化任何其他向量一样。但我的问题是这种归一化方法如何保留相同的旋转信息。使用表示轴角表示的四元数的定义,如下所示,
angle = 2 * acos(q0)
x = qx / sqrt(1-q0*q0)
y = qy / sqrt(1-q0*q0)
z = qz / sqrt(1-q0*q0)
Run Code Online (Sandbox Code Playgroud)
由于归一化操作会同等缩放 x、y、z 值,因此旋转所围绕的轴永远不会改变。但角度本身的值会随着归一化操作而发生巨大变化。
那么使用保留 q0 值并仅调整其他点以达到归一化的方法不是更有意义吗?
因为这是一个复杂的问题,通常会导致很多混乱(我之前已经问过这个问题的变体,但从来没有以正确的方式提出这个问题,也没有得到答案),我将尽量把它说清楚可能的。
事实:
我正在尝试做的事情:
我正在尝试在人形骨骼结构上播放动画,并使用扭矩(旋转力)将物理布娃娃推入与骨骼结构大致相同的姿势。
问题:
我可以在四元数中完全工作,直到需要将扭矩应用于刚体。该AddTorque 函数在欧拉角中有效工作,这意味着我不能使用四元数。我可以轻松地从四元数中提取欧拉角,但它们不可靠并且会导致布娃娃严重变形。
我需要的:
我需要从 Forward、Up 和 Right 向量计算可靠的 3D Euler 角(例如,那些不会从 + 翻转到 - “随机”)。我意识到这有点复杂,但这就是我在这里问的原因:我缺乏自己解决这个问题的知识和经验。
鉴于矢量本身是可靠的,我认为没有理由不能从它们计算出可靠的欧拉角。另外,我不知道我想要或需要欧拉角的旋转顺序,但我相信以后修改会很容易。
任何帮助将非常感激!
我正在使用 Unity 制作一款使用陀螺仪的游戏。我试图检测设备围绕穿过屏幕的轴的旋转,我假设它是 Unity Space 中的 Z 轴。我尝试使用Input.gyro.attitude.eulerAngles.z,但当围绕其他轴倾斜设备时它不会保持恒定,我希望它保持恒定,以便只有“Z 轴”决定汽车方向盘的旋转。我怎样才能实现这个?
编辑:
我尝试做其他事情。我用Input.gyro.rotationRateUnbiased而不是Input.gyro.attitude.eulerAngles
这是代码:
Vector3 gInput = Input.gyro.rotationRateUnbiased;
gyroEuler += gInput * Time.deltaTime * Mathf.Rad2Deg;
float rollAngle = gyroEuler.z;
while (rollAngle < 0)
{
rollAngle += 360;
}
while (rollAngle > 360)
{
rollAngle -= 360;
}
Run Code Online (Sandbox Code Playgroud)
但在游戏开始时gyroEuler将被设置为无论设备方向如何,因此设备方向在开始时不会被知道,而且也非常不准确。我想像《Temple Run 2》等许多游戏那样旋转屏幕,但我希望能够将其旋转 360 度并获得该旋转角度。(0, 0, 0)Input.gyro.rotationRateUnbiased
我想在 python 中创建一个简单的物理系统,它的工作quaternions方式与velocity/position. 它的主要目标是模拟一个被拖动的对象,并随着时间的推移尝试赶上另一个对象。模拟使用 3 个变量::k弹簧常数,d:阻尼因子,和m:拖动对象的质量。
使用经典的欧拉积分,我可以用以下方法解决位置:
import numpy as np
from numpy.core.umath_tests import inner1d
# init simulation values
dt = 1./30. # delta t @ 30fps
k = 0.5 # Spring constant
d = 0.1 # Damping
m = 0.1 # Mass
p_ = np.array([0,0,0]) # initial position of the dragged object
p = np.array([1,2,0]) # position to catch up to, in real life this value could change over …Run Code Online (Sandbox Code Playgroud) 我有一个按以下方式构建的 4x4 变换矩阵:
glm::mat4 matrix;
glm::quat orientation = toQuaternion(rotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::translate(matrix, position);
matrix= glm::scale(matrix, scale);
orientation = toQuaternion(localRotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::scale(matrix, localScale);
Run Code Online (Sandbox Code Playgroud)
其中旋转、位置、缩放、localRotation 和 localScale 都是 vector3。根据许多不同论坛上许多不同问题的建议,应该可以从结果矩阵中提取本地方向,如下所示:
right = glm::vec3(matrix[0][0], matrix[0][1], matrix[0][2]);
up = glm::vec3(matrix[1][0], matrix[1][1], matrix[1][2]);
forward = glm::vec3(matrix[2][0], matrix[2][1], matrix[2][2]);
Run Code Online (Sandbox Code Playgroud)
所有这些方向都被归一化。然后我使用这些方向来获得一个视图矩阵,如下所示:
glm::lookAt(position, position + forward, up);
Run Code Online (Sandbox Code Playgroud)
一切都很好 - 除了:当我在一个场景中飞行时,向右和向上的向量完全错误。前进的方向始终是它应该的样子。当我在 0, 0, -1 看 0,0,0 时,所有方向都是正确的。但是当我从不同的方向看时(除了从 0,0,-1 看原点的逆向),right 和 up 是不一致的。它们不是世界向量,也不是局部向量。它们似乎几乎是随机的。我哪里错了?如何从 4x4 变换矩阵中获得一致的局部向上和局部右向量?
我旋转N使用欧拉3D形状在角XYZ的顺序意味着该对象沿第一旋转X轴线,然后Y再Z。我想将欧拉角转换为四元数,然后使用一些 [最好] Python 代码或只是一些伪代码或算法从四元数返回相同的欧拉角。下面,我有一些代码将欧拉角转换为四元数,然后将四元数转换为欧拉角。然而,这并没有给我相同的欧拉角。
我认为问题是我不知道如何将偏航、俯仰和滚转与 X、Y 和 Z 轴相关联。另外,我不知道如何更改代码中的转换顺序以正确地将欧拉角转换为四元数,然后将四元数转换为欧拉角,以便我能够获得相同的欧拉角。有人可以帮我弄这个吗?
这是我使用的代码:
此函数将欧拉角转换为四元数:
def euler_to_quaternion(yaw, pitch, roll):
qx = np.sin(roll/2) * np.cos(pitch/2) * np.cos(yaw/2) - np.cos(roll/2) * np.sin(pitch/2) * np.sin(yaw/2)
qy = np.cos(roll/2) * np.sin(pitch/2) * np.cos(yaw/2) + np.sin(roll/2) * np.cos(pitch/2) * np.sin(yaw/2)
qz = np.cos(roll/2) * np.cos(pitch/2) * np.sin(yaw/2) - np.sin(roll/2) * np.sin(pitch/2) * np.cos(yaw/2)
qw = np.cos(roll/2) * np.cos(pitch/2) * np.cos(yaw/2) + np.sin(roll/2) * np.sin(pitch/2) * np.sin(yaw/2)
return [qx, qy, qz, qw] …Run Code Online (Sandbox Code Playgroud) Transform.Rotate 有一个非常有用的界面,用于选择是否应该相对于世界轴或局部轴进行旋转。
在幕后,它正在对变换的rotation、 aQuaternion和另一个进行一些数学运算Quaternion。这个数学的确切性质取决于你选择当地国旗还是世界国旗。
我怎样才能在不将第Quaternion一个分配给转换rotation(浪费内存和/或时间)的情况下进行这种数学运算,只是为了用它做一些数学运算?
假设我的第一个Quaternion是Quaternion q1 = Quaternion.Euler(0f,0f,90f);,第二个是Quaternion q2 = Quaternion.Euler(90f,0f,0f)。
沿其局部轴将第二个应用于第一个将产生一个旋转,将其右侧旋转为面朝下,将其正面旋转为右面。
沿原始轴将第二个应用于第一个将产生一个旋转,使其背面朝下旋转,顶部朝右旋转。
如何在 C# 中将两个四元数变量相加?我正在编写摄像机跟随脚本,但我无法弄清楚。
我见过很多这样的问题,但问题是——这个问题毫无意义。它们不是同一件事,这有点像在说“如何将苹果变成砖头”?
但通常潜在的问题确实有道理,令人怀疑的是措辞。
我想做的是这样的:
现在,我想答案是
Vector3 ans = R * Vector3.forward;
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?如果是,为什么?(如果不正确,那么答案是什么?)