three Vector4 四维向量

311 阅读8分钟

在 Three.js 中,Vector4 表示四维向量,常用于存储齐次坐标、颜色或其他四个分量的数据。其分量为 x, y, z(空间坐标或颜色值)和 w(用于齐次坐标、透明度或时间等)。

Vector4 有七个属性四十七个方法

属性

  • isVector4 : Boolean 判断是四维向量
  • x : Float x 分量
  • y : Float y 分量
  • z : Float z 分量
  • w : Float w 分量
  • width : Float z 别名
  • height : Float w 别名

方法

  • add ( v : Vector4 ) : this 将传入的向量v和这个向量相加。
    const v1 = new THREE.Vector4(1, 2, 3, 4);applyMatrix4 ( m : Matrix4 ) : this
    
    const v2 = new THREE.Vector4(5, 6, 7, 8);
    v1.add(v2);  // v1 的新值为 (6, 8, 10, 12)
    console.log(v1);  // 输出: Vector4 {x: 6, y: 8, z: 10, w: 12}
  • addScalar ( s : Float ) : this 将传入的标量s和这个向量的x值、y值、z值以及w值相加。
  • addScaledVector ( v : Vector4, s : Float ) : this 将所传入的v与s相乘所得的乘积和这个向量相加。
    const v1 = new THREE.Vector4(1, 2, 3, 4);
    const v2 = new THREE.Vector4(5, 6, 7, 8);
    const scale = 2;
    v1.addScaledVector(v2, scale);  // v2 的每个分量被乘以 2 后加到 v1
    console.log(v1);  // 输出: Vector4 {x: 11, y: 14, z: 17, w: 20}
  • addVectors ( a : Vector4, b : Vector4 ) : this 将该向量设置为a + b
  • applyMatrix4 ( m : Matrix4 ) : this 是 Three.js 中 Vector4 类的一个方法,用于将 Matrix4 矩阵应用于当前向量 Vector4,并更新当前向量的值。此操作通常用于在 3D 空间中对向量进行变换,比如旋转、缩放或平移。 1729557559854.png
    const v = new THREE.Vector4(1, 0, 2, 1);  // 齐次坐标 (x, y, z, w)
    const matrix = new THREE.Matrix4().makeRotationX(Math.PI / 4);  // 创建绕 X 轴旋转的矩阵
    v.applyMatrix4(matrix);  // 将旋转矩阵应用于向量 v
    console.log(v);  // 输出: 更新后的向量值 { "x": 1, "y": -1.414213562373095, "z": 1.4142135623730951, "w": 1 }
  • ceil () : this 将该向量x分量、 y分量z分量以及w分量向上取整为最接近的整数。
  • clamp ( min : Vector4, max : Vector4 ) : this min - 在限制范围内,x值、y值、z值以及w值的最小值 max - 在限制范围内,x值、y值、z值以及w值的最大值 如果该向量的x值、y值、z值或w值大于限制范围内最大x值、y值、z值或w值,则该值将会被所对应的值取代。 如果该向量的x值、y值、z值或w值小于限制范围内最小x值、y值、z值或w值,则该值将会被所对应的值取代。
  • clampLength ( min : Float, max : Float ) : this min - 长度将被限制为的最小值 max - 长度将被限制为的最大值 如果向量长度大于最大值,则它将会被最大值所取代。 如果向量长度小于最小值,则它将会被最小值所取代。

1729558070426.png

    // 创建一个 Vector4 向量
    const v = new THREE.Vector4(3, 4, 0, 1); // 这个向量的长度是 5
    // 限制向量的长度在 2 到 4 之间
    v.clampLength(2, 4);
    console.log(v); // 输出: { "x": 2.3533936216582085, "y": 3.1378581622109447, "z": 0, "w": 0.7844645405527362 }
  • clampScalar ( min : Float, max : Float ) : this min - 分量将被限制为的最小值 max - 分量将被限制为的最大值 如果该向量的x值、y值、z值或w值大于最大值,则它们将被最大值所取代。 如果该向量的x值、y值、z值或w值小于最小值,则它们将被最小值所取代。
  • clone () : Vector4 返回一个新的Vector4,其具有和当前这个向量相同的x、y、z和w。
  • copy ( v : Vector4 ) : this 将所传入Vector4的x、y、z和w属性复制给这一Vector4。
  • divideScalar ( s : Float ) : this 将该向量除以标量s。
    // 创建一个 Vector4 向量
    const v = new THREE.Vector4(4, 8, 12, 16); // 原始向量
    // 将向量的每个分量都除以 4
    v.divideScalar(4);
    console.log(v); // 输出: { x: 1, y: 2, z: 3, w: 4 }
  • dot ( v : Vector4 ) : Float 计算该vector和所传入v 的点积(dot product)。 1729558449040.png
    // 创建两个 Vector4 向量
    const v1 = new THREE.Vector4(1, 2, 3, 4);
    const v2 = new THREE.Vector4(5, 6, 7, 8);
    // 计算点积
    const dotProduct = v1.dot(v2);
    console.log(dotProduct); // 输出: 70
  • equals ( v : Vector4 ) : Boolean 检查该向量和v的严格相等性。
  • floor () : this 向量的分量向下取整为最接近的整数值。
  • fromArray ( array : Array, offset : Integer ) : this array - 来源矩阵。 offset - (可选)在数组中的元素偏移量,默认值为0。 设置向量中的x值为array[ offset + 0 ],y值为array[ offset + 1 ], z值为array[ offset + 2 ],w 值为array[ offset + 3 ]。
  • fromBufferAttribute ( attribute : BufferAttribute, index : Integer ) : this attribute - 来源的attribute。 index - 在attribute中的索引。 从attribute中设置向量的x值、y值、z值和w值。
  • getComponent ( index : Integer ) : Float index - 0, 1, 2 or 3. 如果index值为0返回x值。 如果index值为1返回y值。 如果index值为2返回z值。 如果index值为3返回w值。
  • length () : Float 计算从(0, 0, 0, 0) 到 (x, y, z, w)的欧几里得长度 (Euclidean length,即直线长度)。 1729558583570.png
    // 创建一个 Vector4 向量
    const v = new THREE.Vector4(3, 4, 12, 16);
    // 计算向量的长度
    const len = v.length();
    console.log(len); // 输出: 19.4164878389476
  • manhattanLength () : Float 计算该向量的曼哈顿长度(Manhattan length)。 1729558661114.png
    // 创建一个 Vector4 向量
    const v = new THREE.Vector4(3, -4, 12, -16);
    // 计算曼哈顿长度
    const manhattanLen = v.manhattanLength();
    console.log(manhattanLen); // 输出: 35
  • lengthSq () : Float 计算从(0, 0, 0, 0)到(x, y, z, w)的欧几里得长度 (Euclidean length,即直线长度)的平方。 如果你正在比较向量的长度,应当比较的是长度的平方,因为它的计算效率更高一些。就是length 不开方的值
  • lerp ( v : Vector4, alpha : Float ) : this v - 朝着进行插值的Vector4。 alpha - 插值因数,其范围通常在[0, 1]闭区间。 在该向量与传入的向量v之间的线性插值,alpha是沿着线的长度的百分比 —— alpha = 0 时表示的是当前向量,alpha = 1 时表示的是所传入的向量v。
  • lerpVectors ( v1 : Vector4, v2 : Vector4, alpha : Float ) : this v1 - 起始的Vector4。 v2 - 朝着进行插值的Vector4。 alpha - 插值因数,其范围在[0, 1]闭区间。 将此向量设置为在v1和v2之间进行线性插值的向量, 其中alpha为两个向量之间连线的长度的百分比 —— alpha = 0 时表示的是v1,alpha = 1 时表示的是v2。
  • negate () : this 向量取反,即: x = -x, y = -y, z = -z , w = -w。
  • normalize () : this 在 Three.js 中,Vector4 的 normalize() 方法用于将向量归一化,即将其长度缩放为 1,同时保留向量的方向。归一化后的向量称为单位向量。 1729559027038.png 1729559109058.png
    // 创建一个 Vector4 向量
    const v = new THREE.Vector4(3, 4, 12, 16);
    // 归一化向量
    v.normalize();
    console.log(v); // 输出:  { "x": 0.1455213750217998, "y": 0.19402850002906638, "z": 0.5820855000871992, "w": 0.7761140001162655 }
  • max ( v : Vector4 ) : this 如果该向量的x值、y值、z值或w值小于所传入v的x值、y值、z值或w值, 则将该值替换为对应的最大值。
  • min ( v : Vector4 ) : this 如果该向量的x值、y值、z值或w值大于所传入v的x值、y值、z值或w值, 则将该值替换为对应的最小值。
  • multiply ( v : Vector4 ) : this 将该向量与所传入的向量v进行相乘。 1729559207493.png
    // 创建两个 Vector4 向量
    const v1 = new THREE.Vector4(1, 2, 3, 4);
    const v2 = new THREE.Vector4(5, 6, 7, 8);
    // 逐元素相乘
    v1.multiply(v2);
    console.log(v1); // 输出: { x: 5, y: 12, z: 21, w: 32 }
  • multiplyScalar ( s : Float ) : this 将该向量与所传入的标量s进行相乘。
  • round () : this 向量中的分量四舍五入取整为最接近的整数值。
  • roundToZero () : this 向量中的分量朝向0取整数(若分量为负数则向上取整,若为正数则向下取整)
  • set ( x : Float, y : Float, z : Float, w : Float ) : this 设置该向量的x、y、z和w分量。
  • setAxisAngleFromQuaternion ( q : Quaternion ) : this q - 归一化的Quaternion(四元数) 1729561262577.png 1729561390642.png
    // 创建一个 Quaternion 表示旋转
    const q = new THREE.Quaternion(0, 0, Math.sin(Math.PI / 4), Math.cos(Math.PI / 4)); // 旋转 90 度绕 Z 轴
    // 创建一个 Vector4 向量
    const v = new THREE.Vector4();
    // 从 Quaternion 设置轴角
    v.setAxisAngleFromQuaternion(q);
    console.log(v); // 输出: 旋转轴和角度 { "x": 0, "y": 0, "z": 1, "w": 1.5707963267948966 }
  • setAxisAngleFromRotationMatrix ( m : Matrix4 ) : this m - 一个Matrix4(四阶矩阵),其左上角3x3的元素表示的是一个纯旋转矩。 将该向量的x、y和z设置为旋转轴,w为角度。 1729560432038.png 1729560958835.png 1729561031029.png 1729561061351.png
    // 创建一个旋转矩阵
    const rotationMatrix = new THREE.Matrix4();
    // 这里可以通过旋转、缩放等操作设置旋转矩阵
    rotationMatrix.makeRotationX(Math.PI / 4); // 例如:绕X轴旋转45度
    // 创建一个轴角向量
    const axisAngle = new THREE.Vector4(); // 或者可以用 THREE.Vector3
    // 使用 setAxisAngleFromRotationMatrix 方法
    axisAngle.setAxisAngleFromRotationMatrix(rotationMatrix);
    // axisAngle 现在包含了从旋转矩阵转换来的轴和角度
    console.log(axisAngle);// { "x": 1, "y": 0, "z": 0, "w": 0.7853981633974484 }
  • setComponent ( index : Integer, value : Float ) : this index - 0、1、2 或 3。 value - Float 若index为 0 则设置 x 值为 value。 若index为 1 则设置 y 值为 value。 若index为 2 则设置 z 值为 value。 若index为 3 则设置 w 值为 value。
  • setLength ( l : Float ) : this 将该向量的方向设置为和原向量相同,但是长度(length)为l。
  • setScalar ( scalar : Float ) : this 将该向量的x、y、z值和w同时设置为等于传入的scalar。
  • setX ( x : Float ) : this 将向量中的x值替换为x。
  • setY ( y : Float ) : this 将向量中的y值替换为y。
  • setZ ( z : Float ) : this 将向量中的z值替换为z。
  • setW ( w : Float ) : this 将向量中的w值替换为w。
  • sub ( v : Vector4 ) : this 从该向量减去向量v。
  • subScalar ( s : Float ) : this 从该向量的x、y、z和w分量中减去标量s。
  • subVectors ( a : Vector4, b : Vector4 ) : this 将该向量设置为a - b。
  • toArray ( array : Array, offset : Integer ) : Array array - (可选)被用于存储向量的数组。如果这个值没有传入,则将创建一个新的数组。 offset - (可选) 数组中元素的偏移量。 返回一个数组[x, y, z, w],或者将x、y、z和w复制到所传入的array中。
  • random () : this 将该向量的每个分量(x、y、z、w)设置为介于 0 和 1 之间的伪随机数,不包括 1。