Babylon.js中的向量操作:BABYLON.Vector3的数学方法

        写在前面:不要用 +、 -、 *、 / 去操作两个BABYLON.Vector3向量,你会得到一个字符串或者NaN,哈哈,这个巨坑啊。同时,BABYLON.Vector3也不会支持类似 +=、-=、*=、/=甚至负号,因为负号就是减号啊。

        Babylon.js提供了强大的`BABYLON.Vector3`类,用于处理三维空间中的向量运算。本文将详细介绍`BABYLON.Vector3`的加法、减法、乘法、除法、点乘、叉乘和投影等操作方法。


加法


`add`方法

        • 功能:返回一个新的`Vector3`,是两个向量的和。
        • 使用示例:
  const vector1 = new BABYLON.Vector3(1, 2, 3);
  const vector2 = new BABYLON.Vector3(4, 5, 6);
  const result = vector1.add(vector2); // { x: 5, y: 7, z: 9 }

`addInPlace`方法

        • 功能:在原向量上进行加法操作,不返回新向量。
        • 使用示例:
vector1.addInPlace(vector2); // vector1 现在是 { x: 5, y: 7, z: 9 }

减法


`subtract`方法

        • 功能:返回一个新的`Vector3`,是两个向量的差。
        • 使用示例:
  const result = vector1.subtract(vector2); // { x: -3, y: -3, z: -3 }

`subtractInPlace`方法

        • 功能:在原向量上进行减法操作,不返回新向量。
        • 使用示例:
  vector1.subtractInPlace(vector2); // vector1 现在是 { x: -3, y: -3, z: -3 }

乘法


`multiply`方法

        • 功能:返回一个新的`Vector3`,是两个向量的逐元素乘积。
        • 使用示例:
  const result = vector1.multiply(vector2); // { x: 4, y: 10, z: 18 }

`multiplyInPlace`方法

        • 功能:在原向量上进行乘法操作,不返回新向量。
        • 使用示例:
  vector1.multiplyInPlace(vector2); // vector1 现在是 { x: 4, y: 10, z: 18 }

`scale`方法

        • 功能:返回一个新的`Vector3`,是向量与标量的乘积。
        • 使用示例:
  const scalar = 2;
  const result = vector1.scale(scalar); // { x: 2, y: 4, z: 6 }

`scaleInPlace`方法

        • 功能:在原向量上进行标量乘法操作,不返回新向量。
        • 使用示例:
  vector1.scaleInPlace(scalar); // vector1 现在是 { x: 2, y: 4, z: 6 }
        特别注意:

        这里需要特别提一下,有些时候我们在需要一个BABYLON.Vector3的负值的时候,习惯性的以为在该值前面添加一个负号就行了,但这是不可行的,像这样下面这样的写法就是错误的:

const v = new BABYLON.Vector3(1, 2, 3);
const oppositeV = -v;//错误的写法,oppositeV的值为NaN,哈哈。

        上面的oppositeV的值为NaN,原因就是既然BABYLON.Vector3没有对 +、-、*、/ 的重载,怎么可能支持负号呢,因为负号本身就是个减号啊,所以正确的写法就是利用scale或者scaleInPlace方法,参考下面的写法:

const v = new BABYLON.Vector3(1, 2, 3);
const oppositeV = v.scale(-1); // 计算相反数

console.log("原始向量:", v); // 输出:Vector3 { x: 1, y: 2, z: 3 }
console.log("相反数向量:", oppositeV); // 输出:Vector3 { x: -1, y: -2, z: -3 }

         或者下面的写法:

const v = new BABYLON.Vector3(1, 2, 3);
v.scaleInPlace(-1); // 直接修改当前向量

console.log("相反数向量:", v); // 输出:Vector3 { x: -1, y: -2, z: -3 }

除法


`divide`方法

        • 功能:返回一个新的`Vector3`,是两个向量的逐元素商。
        • 使用示例:
  const result = vector1.divide(vector2); // { x: 0.25, y: 0.4, z: 0.5 }

`divideInPlace`方法

        • 功能:在原向量上进行除法操作,不返回新向量。
        • 使用示例:
  vector1.divideInPlace(vector2); // vector1 现在是 { x: 0.25, y: 0.4, z: 0.5 }

点乘


`dot`方法

        • 功能:返回两个向量的点乘结果,是一个标量。
        • 使用示例:
  const result = vector1.dot(vector2); // 32

        • 应用场景:点乘用于计算两个向量之间的夹角余弦值,常用于判断向量的方向关系或计算投影长度。


叉乘


`cross`方法

        • 功能:返回一个新的`Vector3`,是两个向量的叉乘结果。
        • 使用示例:
  const result = vector1.cross(vector2); // { x: -3, y: 6, z: -3 }

        • 应用场景:叉乘用于计算两个向量的垂直向量,常用于计算平面的法向量或判断向量的旋转方向。


投影


`project`方法

        • 功能:返回一个新的`Vector3`,是向量在另一个向量上的投影。
        • 使用示例:
 const result = vector1.project(vector2); // 返回vector1在vector2上的投影向量

        • 应用场景:投影用于计算一个向量在另一个向量方向上的分量,常用于物理模拟中的力分解或计算物体在平面上的投影位置。


注意事项

        • 原地操作:`addInPlace`、`subtractInPlace`、`multiplyInPlace`、`divideInPlace`、`scaleInPlace`等方法会修改调用它们的向量对象,而不是返回一个新的向量。选择使用这些方法时,要注意是否需要保留原始向量。
        • 除法操作的注意事项:在使用除法操作时,要确保除数向量的各个分量不为零,以避免出现除以零的错误。
        • 点乘和叉乘的几何意义:点乘结果为标量,表示两个向量之间的夹角余弦值,可用于判断向量的方向关系;叉乘结果为向量,表示两个向量的垂直向量,可用于计算平面的法向量。
        • 投影的应用场景:投影操作常用于物理模拟中的力分解,例如计算一个力在某个方向上的分力,或者用于计算物体在平面上的投影位置,以便进行进一步的处理和分析。

        通过掌握`BABYLON.Vector3`的这些数学方法,你可以在Babylon.js中灵活地进行向量的各种运算,从而实现复杂的几何和物理计算。这些基本操作是3D图形编程中的重要基础,能够帮助你更好地理解和实现3D场景中的各种效果和交互。

你可能感兴趣的:(Babylon,Babylon.js)