<pre> Quaternion.premultiply( q : Quaternion ) : this </pre>
该方法将该四元数对象乘以传递的四元数q。并且它使得传递给函数的四元数q成为函数执行后的前置乘积。
q
- 将要被乘到该四元数对象上的四元数。this
- 返回该四元数对象。var q1 = new THREE.Quaternion( 0.5, 0.5, 0.5, 0.5 );
var q2 = new THREE.Quaternion( 0.5, -0.5, 0.5, -0.5 );
q1.premultiply( q2 ); // q1 = q2 * q1
该方法返回的是调用该方法的四元数对象,该对象已经经过四元数乘法计算后的结果。首先,将要被传递到该方法中的四元数q与该四元数对象的值进行乘法运算,得到该四元数对象的新值。
<pre> THREE.Quaternion.premultiply = function (aq, bq) { var qax = aq._x, qay = aq._y, qaz = aq._z, qaw = aq._w, qbx = bq._x, qby = bq._y, qbz = bq._z, qbw = bq._w;
this._x = qbx * qaw + qby * qaz - qbz * qay + qax * qbw;
this._y = qby * qaw + qbz * qax - qbx * qaz + qay * qbw;
this._z = qbz * qaw + qbx * qay - qby * qax + qaz * qbw;
this._w = qbw * qaw - qax * qbx - qay * qby - qaz * qbz;
return this;
}; </pre>
实际上,该方法返回的是带有新值的原对象。
此函数将四元数的乘积保证为左侧四元数 * 右侧四元数。这意味着,如果首先使用右侧四元数premultiply(),则将该四元数乘以该四元数对象。
通过下面的示例,了解 premultiply()
的作用:
// 声明需要用到的Quaternion对象
var a = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 3);
var b = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 6);
var c = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), Math.PI / 2);
// 实际执行顺序: c*y*x,相当于(240,20,0)
var final_quaternion = a.clone().premultiply(b).premultiply(c);
// 可以理解成顺序这样的:[先旋转yc再旋转xb],最终的新坐标系的z轴向y正半轴,x正方向沿着z轴逆时针旋转30度。