【问题标题】:Calculate point in 3d space, between two points at specific distance计算 3d 空间中的点,在特定距离的两点之间
【发布时间】:2018-03-16 08:51:29
【问题描述】:

对于 three.js 中的相机移动,我需要计算点 C,以便将相机从点 A 移动到一定距离 dist 到点 B

【问题讨论】:

    标签: javascript math 3d three.js


    【解决方案1】:

    three.js 有很容易做到这一点的方法。

    假设abcTHREE.Vector3()的实例,

    a.set( 2, 1, 4 );
    b.set( 9, 4, 2 );
    
    c.subVectors( a, b ).setLength( dist ).add( b );
    

    three.js r.91

    【讨论】:

    • 谢谢它完美地工作!但你能解释一下吗:我不知道你为什么要把b加到dist上,因为你从b中减去dist似乎更符合逻辑
    • dist 是一个长度,它不是一个向量。要到达c,您从b 开始并添加一个长度为dist 的特定向量v。那个向量vc.subVectors( a, b ).setLength( dist )
    【解决方案2】:

    所以你需要计算点C 的坐标,假设它位于BA 之间的线上,距离B 的给定距离?使用以下步骤非常简单:

    • 计算从BA 的向量(这将是A - B)。
    • 规范化该向量(使其长度为 1)。
    • 乘以你想要的距离。
    • 将该向量添加到点B

    一个简短的 javascript 示例:

    const A = [2, 1, 4];
    const B = [9, 4, 2];
    
    const dist = 3;
    
    function addVectors(v1, v2) {
        return v1.map((x, i) => x + v2[i]);
    }
    
    function scalarMultiply(v, c) {
        return v.map(x => x*c);
    }
    
    function getLength(v) {
        return Math.hypot(...v);
    }
    
    const vecB2A = addVectors(A, scalarMultiply(B, -1)); // Step 1
    const normB2A = scalarMultiply(vecB2A, 1/getLength(vecB2A)); // Step 2
    const distB2A = scalarMultiply(normB2A, dist); // Step 3
    const C = addVectors(B, distB2A); // Final step
    
    console.log(C);

    【讨论】:

      【解决方案3】:

      点 C 等于点 B 减去 'dist' 乘以方向为 AB 的单位向量。所以这很容易:

      从 A 到 B 的向量 v 等于 (xB-xA, yB-yA, zB-zA) / 距离(AB)

      然后 C = B - d*v 其中 d 是您希望 C 与 B 的距离。

      【讨论】:

        猜你喜欢
        • 2015-08-16
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 2022-08-14
        • 2011-04-23
        相关资源
        最近更新 更多