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.set()

功能: 设置四元数的值

语法: set( x : Number, y : Number, z : Number, w : Number ) : Quaternion

参数:

  • x: 四元数的x分量
  • y: 四元数的y分量
  • z: 四元数的z分量
  • w: 四元数的w分量

返回值: 传入的四元数

描述:

Quaternion.set() 方法可以用来将四元数的值设置成传入的 x、y、z 和 w 值。它返回传入的四元数。

四元数是一个四元组(x, y, z, w),即

$$q = xi + yj + zk + w$$

其中,i、j、k 是三维坐标系中的单位向量。

Quarternion 是用于旋转的一种数学工具,它可以用来表示三维空间中的旋转。

示例:

var quaternion = new THREE.Quaternion();

quaternion.set( 0, 1, 0, 1 );
console.log( quaternion ); // 输出 {x: 0, y: 1, z: 0, w: 1}

注意事项:

  1. 四元数旋转的公式:$v' = q\cdot v\cdot q^{-1}$,其中 $v$ 表示要旋转的向量,$v'$ 表示旋转后的向量,$q$ 表示旋转的四元数,$q^{-1}$ 表示$q$的逆。
  2. 在使用Quaternion类时,通常是通过调用Quaternion.multiply()方法去叠加多个旋转,而不是调用Quaternion.set()方法去设置某个旋转。例如:
var quaternion1 = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 ); // 翻转90度
var quaternion2 = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3( 1, 0, 0 ), Math.PI / 2 ); // 翻转90度

var quaternion = new THREE.Quaternion();
quaternion.multiply( quaternion1 );
quaternion.multiply( quaternion2 );

在使用setFromAxisAngle()方法时,可以将set()方法与之结合使用,这样可以避免创建多个四元数对象。例如:

var axis = new THREE.Vector3( 1, 0, 0 ); // 绕x轴旋转
var angle = Math.PI / 2;

var quaternion = new THREE.Quaternion().setFromAxisAngle( axis, angle );
quaternion.set( quaternion.x, quaternion.y, quaternion.z, quaternion.w );

这里我们可以看到,我们先通过setFromAxisAngle()方法计算了一个四元数,然后再使用set()方法将其值设置给另一个四元数。这样做的好处是避免了创建多个对象,提高了性能。

  1. Quaternion.set()方法并不会对传入的参数进行归一化处理,因此在使用该方法时需要保证传入的向量已经归一化。如果需要对传入的四元数进行归一化处理,可以调用normalize()方法。例如:
var quaternion = new THREE.Quaternion();
quaternion.set( 0, 1, 0, 1 ); 

quaternion.normalize();
console.log( quaternion ); // 输出 {x: 0, y: 0.7071067811865476, z: 0, w: 0.7071067811865476}