如何在thgree.js场景中的2个点(A(x,y,z),B(x,y,z))之间找到一个点(C(x,y,z))?
我知道这一点:mid point我可以找到他们之间的中间点,但我不想要中间点,我想找到他们之间的点,也有距离a从A点?
在这张图片中你可以看到我的意思:
谢谢。
答案 0 :(得分:32)
基本上你需要获得两点之间的方向向量(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/0mgqa7te/
希望它有所帮助。
答案 1 :(得分:1)
我知道问题出在 THREE.JS ,我最终在 Babylon JS 中寻找了类似的东西。
以防万一,如果您使用的是 Babylon JS Vector3
,则公式将转换为:
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);
}
希望对您有所帮助。
答案 2 :(得分:0)
这在两点之间称为lerp
例如三分: C =新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)
}