Three.js 获取点在曲线上的位置

Three.js 获取点在曲线上的位置,three.js,Three.js,我有一个CatmullRomCurve3,它是由向量3点数组创建的 const curve = new THREE.CatmullRomCurve3(points); 我想知道这些点在曲线上的位置(范围从0到1)。基本上与.getPointAt()相反,第一个点在0,最后一个点在1 我想这样做是为了在用于创建曲线的每个点之间将曲线细分为相等数量的线段。例如,在点0和点1之间获得10个细分,在点1和点2之间获得10个细分,依此类推。我相信有一种数学方法可以解决您的问题,但简单的解决方法是: 使用

我有一个CatmullRomCurve3,它是由向量3点数组创建的

const curve = new THREE.CatmullRomCurve3(points);
我想知道这些点在曲线上的位置(范围从0到1)。基本上与
.getPointAt()
相反,第一个点在0,最后一个点在1


我想这样做是为了在用于创建曲线的每个点之间将曲线细分为相等数量的线段。例如,在点0和点1之间获得10个细分,在点1和点2之间获得10个细分,依此类推。

我相信有一种数学方法可以解决您的问题,但简单的解决方法是:

  • 使用数组或
    Vector3
    s创建原始曲线
  • 使用相同的数组创建一条重复曲线,该曲线在您正在搜索的
    Vector3
    处停止
  • 取第二条曲线的长度除以原始曲线的长度,得到[0,1]的位置
  • 在代码中:

    // Create original curve
    var curve = new THREE.CatmullRomCurve3( [
        new THREE.Vector3( -10, 0, 10 ),
        new THREE.Vector3( -5, 5, 5 ),
        new THREE.Vector3( 0, 0, 0 ),
        new THREE.Vector3( 5, -5, 5 ),
        new THREE.Vector3( 50, 0, 50 )
    ], false );
    
    var searchPoint = new THREE.Vector3( 5, -5, 5 ); // Point we're looking for
    var searchArray = [];   // Array for second curve
    var uPosition = null; // Result is null for now
    
    // Loop through curve.points to find our final point
    for(var i = 0; i < curve.points.length; i++){
        searchArray.push(curve.points[i]);
    
        // Exit loop once point has been found
        if(searchPoint.equals(curve.points[i])){
            // Create shorter curve that stops at desired point
            var curve2 = new THREE.CatmullRomCurve3(searchArray);
    
            // Result is short length / original length
            uPosition = curve2.getLength() / curve.getLength();
            break;
        }
    }
    
    // Result is null if position not found
    console.log(uPosition);
    
    //创建原始曲线
    var曲线=新的三条。CatmullRomCurve3([
    新的三矢量3(-10,0,10),
    新的三矢量3(-5,5,5),
    新的三个矢量3(0,0,0),
    新的三个向量3(5,-5,5),
    新三,矢量3(50,0,50)
    ],假);
    var searchPoint=new-THREE.Vector3(5,-5,5);//我们要找的重点
    var searchArray=[];//第二条曲线的数组
    var upposition=null;//目前结果为空
    //通过curve.points循环找到我们的终点
    对于(变量i=0;i
    让我直说吧;你有一条曲线,你想知道每个顶点的位置,但不是在x-y-z坐标中,而是在曲线上以0%-100%的进度?如果是这样,您是需要在创建曲线的过程中计算它,还是需要在已经生成曲线之后再找出这些值?@Marquizzo Correct。我自己生成曲线,所以我知道“xyz”。因此,可以在创建期间或之后计算该值。谢谢你的解决办法。因为我需要组成曲线的所有节点的位置,所以我可以将它们增量地添加到
    数组中,并在每一步之后获得长度。我将等待接受答案,看看是否有合适的方法,但我对此表示怀疑。如果毕竟,
    upposition
    不是
    null
    ,将
    curve。getPoint(upposition)
    给出与
    搜索点
    相同的向量?