如何将标量乘法应用于四元数 < >我将一些C++转换成JavaScript,我真的需要知道D3DX如何定义它们的四元数运算符。

如何将标量乘法应用于四元数 < >我将一些C++转换成JavaScript,我真的需要知道D3DX如何定义它们的四元数运算符。,javascript,c++,direct3d,quaternions,scalar,Javascript,C++,Direct3d,Quaternions,Scalar,//Here's the c++ version D3DXQUATERNION Qvel = 0.5f * otherQuat* D3DXQUATERNION(angVel.x, angVel.y, angVel.z, 0); //Here's the js quat multiplication function quat_mul(q1, q2) { return [q1.x * q2.w + q1.y * q2.z - q1.z * q2

 //Here's the c++ version
 D3DXQUATERNION Qvel = 0.5f * otherQuat* D3DXQUATERNION(angVel.x, angVel.y, angVel.z, 0);


 //Here's the js quat multiplication
   function quat_mul(q1, q2) {            
   return 
    [q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x,
    -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y,
     q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z,
    -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w]
标量运算quat*0.5f就是这样吗?

     quat.x *= .5;
     quat.y *= .5;
     quat.z *= .5;
     quat.w *= .5;
根据,这就像你说的(也是在四元数系统中):


这是一个非常古老的问题,但我可以从一个公开的来源证实这一点:文斯2011-计算机图形学的四元数,第57-58页

以更简单的形式:

q = [s, v] where s \in R and v \in R^3
\lambda q = [\lambda s, \lambda v] where \lambda \in R
用更复杂的表示法:


q = a + bi + cj + dk

q * s = s * a + bi * s + cj * s + dk * s
      = s * a + (b * s)i + (c * s)j + (d * s)k

在javascript中


设quat=[0.4,0.3,0.7,0.1];
函数四元数\标量\乘法(quat,s){
quat[0]*=s;
quat[1]*=s;
quat[2]*=s;
quat[3]*=s;
返回quat;
}

我认为这没有抓住重点。如果要处理表示旋转的四元数,则只有单位四元数有效。这样的缩放不会导致除1.0以外的任何缩放的单位四元数。虽然这可能是头中的一个实际操作符,但它不会产生一个缩放的旋转。@ Jeigoo:我不明白你的观点:问题显然是由标量乘法,而不是旋转的缩放。我想我的观点是,他几乎肯定会问错的问题,并且原来的C++代码可能不正确,如果他想做的是应用一个缩放的角速度,或者通过乘以时间因子将角速度转换成旋转。@Jherico:我不知道OPs的问题是什么,也不知道我们这里是否有XY问题。但我看不出我的回答是如何忽略了问题的重点,这是关于标量乘法的。但我想这对未来的读者来说是值得一提的:)@Jherico这个问题清楚地表明他正在移植代码,需要用Javascript实现相同的功能,所以这个答案完全正确,我认为没有必要质疑OP对自己情况的把握。

q = a + bi + cj + dk

q * s = s * a + bi * s + cj * s + dk * s
      = s * a + (b * s)i + (c * s)j + (d * s)k