gpt4 book ai didi

math - 从两个3D向量定义的旋转中计算3x3旋转矩阵的有效方法

转载 作者:行者123 更新时间:2023-12-04 08:34:59 25 4
gpt4 key购买 nike

虽然我找到了两种解决方案,但我很好奇是否有众所周知的方法来执行此操作,因为这似乎是一项很常见的任务。
这是psudo-code的2种明显方法...
轴角
这是很合逻辑的,但是调用了sin两次,并且调用了cos一次(在角度计算和轴到矩阵的角度转换中)。

Matrix3x3 rotation_between_vectors_to_matrix(const Vector v1, const Vector v2)
{
angle = v1.angle(v2);
axis = v1.cross(v2);

/* maths for this is well known */
Matrix3x3 matrix = axis_angle_to_matrix(axis, angle);

return matrix;
}
编辑:最简单的功能相当慢,但是正如此处答复中所指出的:可以通过分别从轴长和 angle_sin点积获得 angle_cosv1,v2来避免计算角度。
两种矩阵之间的差异
这是我发现的另一种方法,该方法从向量构造两个3x3矩阵并返回差值。
但是,这比可以优化的轴/角度计算要慢(如上所述)。
笔记。假设两个向量均已归一化,矩阵为列大(OpenGL)。
Matrix3x3 rotation_between_vectors_to_matrix(const Vector v1, const Vector v2)
{
Matrix3x3 m1, m2;

axis = v1.cross(v2);
axis.normalize();

/* construct 2 matrices */
m1[0] = v1;
m2[0] = v2;

m1[1] = axis;
m2[1] = axis;

m1[2] = m1[1].cross(m1[0]);
m2[2] = m2[1].cross(m2[0]);

/* calculate the difference between m1 and m2 */
m1.transpose();

Matrix3x3 matrix = m2 * m1;

return matrix;
}
有更好的方法来执行此计算吗?
编辑:这个问题的目的不是对每种方法进行微优化和基准测试。相反-我很好奇是否有一些我不知道的完全不同和更好的方法。

注意:为了使示例简单起见,我故意不检查共线性矢量(轴为零长度)的简并情况。

最佳答案

您发布的两种方法都可以进行优化。
方法1
与其使用acos来找到两个向量之间的夹角,不如做一个更好的事情是完全避免找到夹角。如何? Rodrigues的axis-angle formula只需要sin θcos θ1 - cos θ,因此查找实际角度是多余的。
我们知道v1v2是单位向量; v1 · v2 = |v1| |v2| cos θ,因为|v1| = |v2| = 1v1 · v2直接给了我们cos θ,所以找到1 - cos θ并不昂贵。 v1 × v2 = |v1| |v2| sin θ n = sin θ n,其中n是垂直于v1v2的单位向量,找到|v1 × v2|叉积的大小将直接给出sin θ
现在我们有了sin θcos θ,我们可以使用Rodrigues forumla直接形成旋转矩阵。 here's a simple implementation(尽管页面声称使用四元数数学,但这是“轴角到矩阵”的转换公式)。
方法二
在将两个正交框架构造为矩阵之后,可以避免进行第二次转置。这是证明。
假设AB是两个矩阵,因为您希望从A旋转到B,我们需要一些矩阵X,将其与A相乘将得到B:

XA = B

X = BA⁻¹


这就是您所需要的;当您将 X预乘以 A时,您会得到 B。但是,您发现的是 Y

Y = AB⁻¹

YB = A


然后您转置 Y以获得 Y⁻¹,即

Y⁻¹YB = Y⁻¹A

B = Y⁻¹A


无需进行两个逆运算(在此进行转置),您可以执行上述方法,该方法仅涉及一个转置。
我仍然要说的是,如果没有以优化形式对方法进行基准测试,我们不能说方法2比方法1更快。因此,我真的敦促您在两种方法之间进行基准测试(带有一些非平凡的负载),然后绘制结论。

关于math - 从两个3D向量定义的旋转中计算3x3旋转矩阵的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23166898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com