如何将两个四元数相乘

问题描述 投票:0回答:4

我有两个四元数,例如:

    w     x     y     z
1:  0.98  0.08  0.17  -0.01
2:  0.70  0.70  0.0   0.0

我需要将它们相乘,得到第三个,其中包含所有旋转,但没有任何想法。 如果 PHP / C++ / PAWN 中有一个函数可以完成这样的事情,那就完美了。

我查了很多,但几乎没有找到让我理解的。

感谢您的回答。

php c++ function 3d quaternions
4个回答
7
投票

您应该选择一种语言。在 C++ 中,Boost.Math 库包含 quaternions;我不知道你提到的其他语言。或者对于简单的乘法,您可以使用乘法表(我从Wikipedia复制):

*| 1  i  j  k
-------------
1| 1  i  j  k
i| i -1  k -j
j| j -k -1  i
k| k  j -i -1

例如,

i*j
给出第
i
行和
j
列中的值,即
k

所以,假设你的四元数代表

w*1 + x*i + y*j + z*k
,乘法会像

quaternion operator*(quaternion a, quaternion b) {
    return {
        a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,  // 1
        a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,  // i
        a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,  // j
        a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w   // k
    };
}

(注意:未经测试,并且可能充满拼写错误)。


1
投票

好的,那么在wiki之后。

我会做类似的事情:

class Quaternion{
double w,x,y,z;

public:
 Quaternion(double w, double x, double y, double z) : w(w), x(x), y(y), z(z) {};

 operator*(const Quaternion& rhs){
   double _w, _x, _y, _z;
   //compute new values
   _w = w*rhs.w - x*rhs.x - y*rhs.y - z*rhs.z;
   _y = /* after wiki */;
   _x = /* after wiki */;
   _z = /* after wiki */;

   //update values
   w = _w; x = _x; y = _y; z = _z; 
 }
}

即创建一个包含 4 个实数的对象,编写一个运算符来计算新系数。


0
投票

将虚数

xi+yj+zk
表示为向量,
Qc{Wc,Vc} = Qa{Wa,Va} * Qb{Wb,Vb}
的乘法如下:
Qc{Wc,Vc} = {WaWb + WaVb + WbVa + VaVb}

VaVb = -(Va dot Vb) + (Va cross Vb)
[前者是缩放器,后者是向量],然后对缩放器和向量进行分组:
Qc{Wc,Vc} = {WaWb + -(Va dot Vb), WaVb + WbVa + (Va cross Vb)}


0
投票

有趣,但对于这样一个简单的问题来说,大部分内容都太浮夸了。

使用numpy计算两个四元数相乘的公式:

import numpy as np

q1 = np.array([v1, s1])

q2 = np.array([v2, s2])

q3 = s1*v1 + s2*v2 + np.cross(v1, v2), s1*s2 - np.dot(v1, v2)

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