Three.js 把 Blender 绘制的曲线(Bezier / 曲线) 导入 Three.js 并作为运动路径 / 动画路径使用

把 Blender 绘制的曲线(Bezier / 曲线) 导入 Three.js 并作为运动路径 / 动画路径使用,核心就两步:导出正确格式 + Three.js 解析为路径。

Blender 导出正确格式

绘制曲线

直接用 Blender 官方插件 Export Curve to JSON,一键导出曲线完整数据,自动适配坐标系:

  1. Blender 扩展 → 搜索安装:Export Curve to JSON
  2. 选中曲线 → 文件→导出→Export Curve (.json)
  3. 导出的路径JSON文件:

Three.js 解析为路径

Three.js 直接加载生成 CurvePath,无需处理顶点。

js 复制代码
// 加载路径
fetch('./line.json')
    .then(res => res.json())
    .then(data => {
        // 1. 取出所有路径点
        const pointsData = data.curves[0][0].points;

        // 2. 转成 Three.js 向量
        const points = [];
        for (const p of pointsData) {
            const x = p.position[0];
            const y = p.position[1];
            const z = p.position[2];
            points.push(new THREE.Vector3(x, y, z));
        }

        // 3. ✅ 生成路径(这就是你要的路径!)
        const path = new THREE.CatmullRomCurve3(points, false);

        console.log('路径加载成功!');
        console.log(path.getPointAt(0.5)); // 路径中点
        console.log(path.getPointAt(0));   // 起点
        console.log(path.getPointAt(1));   // 终点

        // 可视化路径(红色线)
        const linePoints = path.getPoints(200);
        const geo = new THREE.BufferGeometry().setFromPoints(linePoints);
        const mat = new THREE.LineBasicMaterial({ color: 0xff0000 });
        const line = new THREE.Line(geo, mat);
        scene.add(line);

        // 移动立方体沿路径
        moveCubeAlongPath(path)

    });

构造函数

CatmullRomCurve3( points : Array, closed : Boolean, curveType : String, tension : Float )

  • points -- Vector3点数组
  • closed -- 该曲线是否闭合,默认值为false。
  • curveType -- 曲线的类型,默认值为centripetal。
  • tension -- 曲线的张力,默认为0.5。

定义延路径移动

这里我们使用 GSAP 动画库完成路径动画

js 复制代码
function moveCubeAlongPath(path) {
    const cube = cityComponents.get('Cube')

    // const cubeAnimation = gsap.to(cube.position, { duration: 1, x: 2, ease: "power2.inOut" })
    const proxy = { t: 0 }
    gsap.to(proxy, {
        duration: 5,
        t: 1,
        onUpdate: () => {
            const pos = path.getPoint(proxy.t)
            cube.position.copy(pos)
        }
    })
}

完美!

相关推荐
福兮说7 分钟前
用 IndexedDB 存用户的文件,我踩过的五个坑
前端·javascript
lv__pf20 分钟前
seata【实战 msb】
java·开发语言·后端
点纭21 分钟前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
胡志辉的博客1 小时前
【完全开源】IP 纯净度检测 可一键部署到自己的CF
前端·javascript·chrome·ip·chromium
事已至此先睡覺吧1 小时前
第三篇:Java 流程控制详解:条件判断、循环与跳转语句
java·开发语言
Hilaku1 小时前
作为面试官,我最怕遇到什么样的候选人?
前端·javascript·程序员
m0_734571761 小时前
深入理解5g <二十> dmrs
开发语言·5g
金金计较.2 小时前
Go语言-4
开发语言·golang
web3d5202 小时前
01-用 Leafletjs 10 分钟搭一张水利一张图(Vue3 + Vite 实战)
前端·javascript
泡海椒2 小时前
jquick-pdf 表格行列尺寸控制实战:单元格合并的可行边界
java·开发语言·pdf