Skip to content

简介

<template>
    <div id="TO" :style="{ width: width + '%', height: height + 'px' }"></div>
</template>

<script setup>
import { onMounted } from 'vue';
//导入关节运动描述数据
import axis from "./utils/weld/axis.js"
//导入起始状态关节数据
import startData from "./utils/weld/startData.js"
//导入结束状态关节数据
import endData from "./utils/weld/endData.js"
//导入第二个起始状态关节数据
import startDataNext from "./utils/weld/startDataNext.js"
//导入第二个结束状态关节数据
import endDataNext from "./utils/weld/endDataNext.js"

const props = defineProps({
    width: {
        type: Number,
        default: 100,
    },
    height: {
        type: Number,
        default: 400,
    },
});

onMounted(() => {
    //初始化场景
    let TO = new ThingOrigin("easyBuild", document.getElementById("TO"), {
        helper: {//辅助工具
            axes: {
                active: false,
            },
            grid: { //网格
                active: false,
            },
        },
        scene: {
            background: { //背景工厂
                type: 'workshop',
                workshop: {
                    url: `http://124.70.30.193:8084/model2/loadFileByName/workshop`
                }
            }
        }
    });

    let scaleNum = 15;
    // 机械臂模型数据
    let weldInfo = {
        modelType: "gltf",//模型类型
        modelName: "weld",//模型名称
        base: {
            modelUrl: `${import.meta.env.BASE_URL}models/weld.gltf`, // 模型地址
        },
        scale: {//模型缩放大小
            x: scaleNum,
            y: scaleNum,
            z: scaleNum,
        },
        position:{
            y: 1
        }
    }
    //汽车模型数据据
    let carInfo = {
        modelType: "gltf",//模型类型
        modelName: "car",//模型名称
        base: {
            modelUrl: `${import.meta.env.BASE_URL}models/car.gltf`,  // 模型地址
        },
        scale: {//模型缩放大小
            x: scaleNum,
            y: scaleNum,
            z: scaleNum,
        },
           position:{
            y: 1
        }
    }

    //加载模型
    TO.model.initFileModel(carInfo).then((model) => {
        TO.scene.add(model.scene);//将模型添加到场景
    })
    //加载模型
    TO.model.initFileModel(weldInfo).then((model) => {
        TO.scene.add(model.scene);//将模型添加到场景
        moveRobot(); // 6 轴机械臂运动起来
    })

    function moveRobot() {
        //获取名称为 weld 的 6 轴机械臂
        let weld = TO.scene.getObjectByProperty("name", "weld");
        //起始与结束两个姿态间平滑运动
        TO.machine.twinModel(
            weld,
            axis, //axis 代表 6 轴关节数据
            startData.robot1, //startData 代表 6 轴关节数据的起止位置
            endData.robot1, //endData 代表 6 轴关节数据的结束位置
            2000
        )
        //间隔 2200ms 再次启动下一个运动状态
        setTimeout(() => {
            TO.machine.twinModel(
                weld,
                axis,
                startDataNext.robot1,
                endDataNext.robot1,
                2000
            )
        }, 2200)
    }
});
</script>

<style scoped>
#TO {
    width: 100%;
    height: 400px;
    position: relative;
}
</style>

什么是 ThingOrigin?

ThingOrigin.js 是一个基于 three.js、cannon.js 封装的 3D 引擎框架,专为 web 端设计。它的目标是简化开发者的开发过程,通过提供零基础、低门槛的方式,帮助用户快速搭建动态 3D 场景和模拟物理场景。

ThingOrigin 解决了传统 3D 开发人员投入大、开发效率低、场景搭建周期长、部署难等问题。无论是初学者还是有经验的开发人员,都能轻松上手,构建丰富的可视化应用。

ThingOrigin 有什么优势?

轻量化:极简的 1.6M 单文件呈现形式,无须安装额外插件,单个 JS 文件即可部署运行,真正实现「即开即用」,小巧高效,丝滑的 3D 性能体验。

模块化:搭载 100 + 标准化模块矩阵,覆盖场景搭建、交互逻辑、特效渲染等全链路开发需求,支持「乐高式」自由组合,轻松搭建数字孪生场景。

易学易用:深度优化 Three.js API,代码量直降 60%,采用极简开发范式,5 分钟快速搭建三维场景,让开发者直击业务核心,轻松跨越 3D 开发门槛。

数据驱动:内置标准化数据描述模块,贯穿动画生成、效果控制、逻辑交互等全流程开发环节,支持「参数化积木」式自由组装,让复杂功能转化为可视化数据模块,一键实现动态效果的精准调控与智能呈现。