BufferGeometry
Object3D
Raycaster
Camera
CubeCamera
PerspectiveCamera
OrthographicCamera
StereoCamera
Clock
Curve
CurvePath
Path
Shape
ShapePath
ArrowHelper
AxesHelper
BoxHelper
Box3Helper
CameraHelper
DirectionalLightHelper
GridHelper
PolarGridHelper
HemisphereLightHelper
PlaneHelper
PointLightHelper
SkeletonHelper
SpotLightHelper
Light
PointLight
RectAreaLight
SpotLight
DirectionalLight
HemisphereLight
LightShadow
PointLightShadow
AnimationLoader
AudioLoader
BufferGeometryLoader
CompressedTextureLoader
CubeTextureLoader
DataTextureLoader
FileLoader
ImageBitmapLoader
ImageLoader
Loader
LoaderUtils
MaterialLoader
ObjectLoader
TextureLoader
LoadingManager
Material
Box2
Box3
Color
Cylindrical
Euler
Frustum
Interpolant
Line3
MathUtils
Matrix3
Matrix4
Plane
Quaternion
AnimationAction
AnimationClip
AnimationMixer
AnimationObjectGroup
AnimationUtils
keyframeTrack
PropertyBinding
PropertyMixer
BooleanKeyframeTrack
QuaternionKeyframeTrack
StringKeyframeTrack
Audio
AudioAnalyser
AudioContext
AudioListener
PositionalAudio

Quaternion.premultiply()

<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度。

参考