在three.js中如何找到两点之间的特定位置

15

如何在three.js场景中找到两个点(A(x,y,z),B(x,y,z))之间的一个点(C(x,y,z))?

我知道可以使用中点公式找到它们的中心点,但是我想找到距离A点为a的中间点?

你可以看下面的图片来了解我的意思:

enter image description here

谢谢。


1
这里有很多信息:https://dev59.com/VnM_5IYBdhLWcg3wvF3J - gaitat
3个回答

41

基本上,您需要获取两个点之间的方向向量(D),对其进行归一化,然后将其用于获取新的点:NewPoint = PointA + D * Length

您可以使用长度归一化(0..1)或作为从0到方向向量长度的绝对值。

以下是使用两种方法的一些示例:

使用绝对值:

function getPointInBetweenByLen(pointA, pointB, length) {
    
    var dir = pointB.clone().sub(pointA).normalize().multiplyScalar(length);
    return pointA.clone().add(dir);
       
}

并且可以用于百分比值(0..1)

function getPointInBetweenByPerc(pointA, pointB, percentage) {
    
    var dir = pointB.clone().sub(pointA);
    var len = dir.length();
    dir = dir.normalize().multiplyScalar(len*percentage);
    return pointA.clone().add(dir);
       
}

看它在实际操作中的表现:http://jsfiddle.net/8mnqjsge/

希望它有所帮助。


2
这被称为两个点之间的lerp
例如,在 Three 中: C = new Three.Vector3() C.lerpVectors(A, B, a)
在通用情况下,这只是每个轴上单个lerp(线性插值)数学运算(基本上是(a * t) + b * (1 - t))。Lerp可以描述如下:
function lerp (a,  b,  t) {
    return a + t * (b - a)
}

在你的情况下(参见上文):
A = {
  x: lerp(A.x, B.x, a),
  y: lerp(A.y, B.y, a),
  z: lerp(A.z, B.z, a)
}

2
我知道这个问题是关于THREE.JS的,但我最终在Babylon JS中寻找类似的东西。
如果您正在使用Babylon JSVector3,那么公式将被翻译为:
function getPointInBetweenByPerc(pointA, pointB, percentage) {

    var dir = pointB.clone().subtract(pointA);
    var length = dir.length();
    dir = dir.normalize().scale(length *percentage);
    return pointA.clone().add(dir);

  }

希望能对某些人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接