three.js实现通过两点绘制贝塞尔曲线

/**
     * 通过两点绘制贝塞尔曲线
     * v0:起点, 
     * v3:终点
     */
    function addLines(v0, v3) {
        // 计算向量夹角
        let angle = v0.angleTo(v3) * 270 / Math.PI / 10; // 0 ~ Math.PI
        let aLen = angle * 50,
            hLen = angle * angle * 120;
        let p0 = new THREE.Vector3(0, 0, 0);

        // 开始,结束点
        // let v0 = groupDots.children[0].position;
        // let v3 = groupDots.children[1].position;

        // 法线向量
        let rayLine = new THREE.Ray(p0, getVCenter(v0.clone(), v3.clone()));

        // 顶点坐标
        let vtop = rayLine.at(hLen / rayLine.at(1).distanceTo(p0));

        // 控制点坐标
        let v1 = getLenVcetor(v0.clone(), vtop, aLen);
        let v2 = getLenVcetor(v3.clone(), vtop, aLen);

        // 绘制贝塞尔曲线
        let curve = new THREE.CubicBezierCurve3(v0, v1, v2, v3);
        let geo = new THREE.Geometry();
        geo.vertices = curve.getPoints(50);
        let mat = new THREE.LineBasicMaterial({color: 0xff0000});

        return {
            curve: curve,
            lineMesh: new THREE.Line(geo, mat)
        };
    }

    // 计算v1,v2 的中点
    function getVCenter(v1, v2) {
        let v = v1.add(v2);
        return v.divideScalar(2);
    }

    // 计算V1,V2向量固定长度的点
    function getLenVcetor(v1, v2, len) {
        let v1v2Len = v1.distanceTo(v2);
        return v1.lerp(v2, len / v1v2Len);
    }

posted @   huangchun0121  阅读(157)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示