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

完美!

相关推荐
一次旅行19 分钟前
多智能体编排实战:拆解Plan-and-Execute范式+三层记忆架构,手写无依赖轻量Agent调度引擎
前端·javascript·架构
用户昵称10034 分钟前
C/C++编程-工程实践-本地存储log的工程意义
c语言·开发语言
吹什么轩2 小时前
c++复习:map和set的使用
开发语言·c++
必须得开心呀2 小时前
qt生成dump文件并定位异常
开发语言·qt
fpcc2 小时前
跟我学C++中级篇—内存流
开发语言·c++
Cicada1282 小时前
ccvt:一个用 Rust 写的中国地图坐标系互转命令行工具
开发语言·后端·rust
1001101_QIA2 小时前
工控机网络配置
开发语言·数据库·php
sugar__salt2 小时前
跟着 Demo 学 Pinia:两种仓库写法 + 完整 TodoList 复现
前端·javascript·vue.js·前端框架·vue
程序员雷欧3 小时前
ThreadPoolExecutor 深度解析:从核心参数到源码实现的全面剖析
java·开发语言·jvm