经过一番思考,我想出了以下代码,用于使用SSE乘以两个四元数:
#include <pmmintrin.h> /* SSE3 intrinsics */
/* multiplication of two quaternions (x, y, z, w) x (a, b, c, d) */
__m128 _mm_cross4_ps(__m128 xyzw, __m128 abcd)
{
/* The product of two quaternions is: */
/* (X,Y,Z,W) = (xd+yc-zb+wa, -xc+yd+za+wb, xb-ya+zd+wc, -xa-yb-zc+wd) */
__m128 wzyx = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(0,1,2,3));
__m128 baba = _mm_shuffle_ps(abcd, abcd, _MM_SHUFFLE(0,1,0,1));
__m128 dcdc = _mm_shuffle_ps(abcd, abcd, _MM_SHUFFLE(2,3,2,3));
/* variable names below are for parts of componens of result (X,Y,Z,W) */
/* nX stands for -X …Run Code Online (Sandbox Code Playgroud) 我gluDisk()在我的场景中使用平面磁盘.gluDisk()绘制面向正Z轴的磁盘,但我希望它面对一些任意正常的我.
显然,我需要使用glRotate()以使磁盘正确面对,但旋转应该是什么?我记得这可以用Quaternions计算,但我似乎无法记住数学.
我正在尝试在我的爱好游戏引擎中使用轴角向量进行旋转.这是沿旋转轴的3分量矢量,旋转长度以弧度表示.我喜欢他们因为:
但是,我有一个紧密的循环,根据角速度更新我的所有物体(数万)的旋转.目前,我知道组合两个旋转轴向量的唯一方法是将它们转换为四元数,将它们相乘,然后将结果转换回轴/角度.通过剖析,我发现这是一个瓶颈.有谁知道更直接的方法?
我试图理解四元数旋转是如何工作的,我找到了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion-rotation/但他做了一些假设,我无法锻炼,就像我怎样才能" 围绕每个轴计算旋转矢量,只需绕轴旋转矢量. "他如何计算angleDegreesX,angleDegreesY和angleDegreesZ?
有人可以提供一个工作实例或解释吗?
新手stackoverflow参与者,新手3D程序员,远离数学wiz ...所以我会尝试尽可能清楚地构建这个问题,希望它有意义,并希望得到一个不是一英里的答案.
我使用three.js编写了一个非常酷的应用程序,让用户可以飞过3D空间并探索太阳系.飞行模型松散地基于three.js包中的Fly.Controller示例/扩展,它教会我使用四元数来保持所有轴旋转相对于彼此合理.飞行部分都很棒.
这是我的困境:当使用四元数时,我如何推断出"正常"(我不知道还有什么称之为)旋转值来确定我面临的方向?使用四元数时,相机对象内的"旋转"结构保持为0,0,0.因此,虽然我可以在任何角度自由地飞越太空,但我无法弄清楚如何确定我实际面对的方向.是否有内置的three.js功能,或其他简单的方法来转换它?
我在网上发现了一些类似的,令人困惑的指针,但我无法解读并在三个.js中使用.谢谢.
我想为现有的四元数添加一个euler角度.这是我得到的:
Quaternion oldTransform = transform.Rotation;
float YawRotation = mouseDiff.x * RotationSpeed;
Quaternion YawRotationQuaternion = new Quaternion();
YawRotationQuaternion.CreateFromAxisAngle (0, 1, 0, YawRotation);
float PitchRotation = mouseDiff.y * RotationSpeed;
Quaternion PitchRotationQuaternion = new Quaternion();
PitchRotationQuaternion.CreateFromAxisAngle ( 1, 0, 0, PitchRotation);
Quaternion result = oldTransform * YawRotationQuaternion * PitchRotationQuaternion;
transform.Rotation = result;
Run Code Online (Sandbox Code Playgroud)
我想只有偏航和俯仰旋转.旧变换具有此属性.我添加的我的欧拉角也只是俯仰和偏航旋转.当我乘以它时会发生的事情是oldTransform描述的旋转引入了滚动旋转.
然后我试过:
Quaternion result = YawRotationQuaternion * oldTransform * PitchRotationQuaternion;
Run Code Online (Sandbox Code Playgroud)
这不会引入滚动旋转.当oldTransform将偏航轴旋转到俯仰轴上时,此选项更加糟糕,因为它具有万向节锁定.
现在我能想象的是,从旧的变形获得旧的偏航和俯仰旋转,并修改偏航和俯仰轴,使它们不再是(0,1,0)和(1,0,0).这里的问题是,当我从四元数中提取欧拉角时,我也会得到万向节锁.
那么如何将特定轴的euler角度添加到四元数?
我有两个四元数,例如:
w x y z
1: 0.98 0.08 0.17 -0.01
2: 0.70 0.70 0.0 0.0
Run Code Online (Sandbox Code Playgroud)
我需要将它们相乘,得到第三个,其中包含所有旋转。
我如何在 PHP/C++/PAWN 中做到这一点?
我想阅读斯坦福兔子的未重建数据.点数据存储为多个范围图像,必须将其转换为组合成一个大点云,如README中所写:
These data files were obtained with a Cyberware 3030MS optical
triangulation scanner. They are stored as range images in the "ply"
format. The ".conf" file contains the transformations required to
bring each range image into a single coordinate system.
Run Code Online (Sandbox Code Playgroud)
这是.conf文件:
camera -0.0172 -0.0936 -0.734 -0.0461723 0.970603 -0.235889 0.0124573
bmesh bun000.ply 0 0 0 0 0 0 1
bmesh bun045.ply -0.0520211 -0.000383981 -0.0109223 0.00548449 -0.294635 -0.0038555 0.955586
bmesh bun090.ply 2.20761e-05 -3.34606e-05 -7.20881e-05 0.000335889 -0.708202 …Run Code Online (Sandbox Code Playgroud) 我见过几个类似的问题,并对我可能尝试的内容有一些想法,但我不记得看到过任何有关传播的内容。
所以:我正在开发一个测量系统,最终基于计算机视觉。
我进行 N 个捕获,并使用一个库来处理它们,该库以平移和旋转的 4x4 仿射变换矩阵的形式输出姿势估计。
这些姿势估计中有一些噪音。每个旋转轴的欧拉角的标准偏差小于 2.5 度,因此所有方向都非常接近(对于所有欧拉角都接近 0 或 180 的情况)。小于 0.25 度的标准误差对我来说很重要。但我已经遇到了欧拉角特有的问题。
我想对所有这些非常接近的姿势估计进行平均以获得单个最终姿势估计。我还想找到一些传播的衡量标准,以便我可以估计准确性。
我知道“平均”对于轮换实际上并没有很好的定义。
(郑重声明,我的代码是使用 Numpy 的 Python 编写的。)
我也可能想对这个平均值进行加权,因为已知某些捕获(和某些轴)比其他捕获更准确。
我的印象是,我可以只取平移向量的平均值和标准差,对于旋转,我可以转换为四元数,取平均值,并以良好的精度重新归一化,因为这些四元数非常接近。
我还听说过所有四元数中的最小二乘法,但我对如何实现这一点的大部分研究都以惨败告终。
这可行吗?在这种情况下是否有一个合理明确的传播衡量标准?
geometry quaternions affinetransform rotational-matrices pose-estimation
将矢量(X,Y,Z)从 ENU 旋转到 NED 的统一方法,反之亦然
\n将四元数从 ENU 旋转到 NED 的统一方法,反之亦然
\n如果可以给出解决方案,我们将不胜感激python,但对我来说更多的是专业知识。
如果我在 ENU 中有这个向量
\nv_xyz_ENU = [5,2,1] \nRun Code Online (Sandbox Code Playgroud)\n翻译为
\nv_xyz_NED = [2,5,-1]\nRun Code Online (Sandbox Code Playgroud)\n\n\nENU <-> NED
\n
\nX, Y, Z <-> Y, X,-Z
如果我在包含 RPY 的向量上使用这种技术(如果这是正确的表达方式),我会感到困惑。
v_rpy_ENU = [0,0,90] \nRun Code Online (Sandbox Code Playgroud)\n翻译为
\nv_rpy_NED = [0,0,-90]\nRun Code Online (Sandbox Code Playgroud)\n当我写下计算时,我更喜欢使用以度为单位的角度
这个旋转似乎不正确,因为我知道结果应该是 0\xc2\xb0
\nENU Yaw 0\xc2\xb0 应该是 NED Yaw -90\xc2\xb0
\nENU Yaw 90\xc2\xb0 应该是 NED Yaw 0\xc2 \xb0
\nENU …