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)
        }
    })
}

完美!

相关推荐
qq_419854059 小时前
空间网格管理器
前端·javascript·html
没钥匙的锁111 小时前
16-Java反射机制:Spring IOC背后的核心技术
java·开发语言·spring
起予者汝也11 小时前
Python 数据结构
开发语言·数据结构·python
李明卫杭州11 小时前
Vue2 与 Vue3 自定义指令详解:钩子变化、迁移指南与实战示例
前端·javascript·vue.js
七月丶11 小时前
线上出 Bug,你还在让用户"清一下缓存"?我用一个插件让每个请求自报版本
前端·javascript·面试
不简说11 小时前
JS 代码技巧 vol.3 — 10 个防抖节流深挖,小白到老炮的踩坑路
前端·javascript·面试
小智社群11 小时前
VR漫游视频完整版
前端·javascript·音视频
ECT-OS-JiuHuaShan13 小时前
严格证明:还原论是ASCII,整体论是UTF-8的历史意义和价值
开发语言·人工智能·算法·量子计算
nicole bai13 小时前
vue 自定义模块内容
前端·javascript·vue.js
AC赳赳老秦13 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw