Skip to content

案例展示

通过相机控制实现模型聚焦和视角切换效果

<template>
    <div style="position: relative">
        <div id="TO"></div>

        <el-button type="primary" size="small" id="btn1" @click="focusOn(0)">聚焦ABB机器人</el-button>
        <el-button type="primary" size="small" id="btn2" @click="focusOn(1)">聚焦数字机床</el-button>
        <el-button type="primary" size="small" id="btn3" @click="lookAt(2)">观察精雕机床</el-button>
    </div>
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { ElButton, ElInput, ElCard } from 'element-plus'
import { Camera } from '@element-plus/icons-vue'
let TO

let modelList = [
    {
        modelType: 'gltf', //模型类型
        modelName: 'ABB机器人-1', //模型名称
        position: {
            //模型位置
            x: 0,
            y: 0,
            z: 0
        },
        base: {
            //模型地址
            modelUrl: 'https://124.70.30.193:8443/model2/loadFileAsId/56201403'
        }
    },
    {
        rotation: {
            x: 3.14,
            y: 0,
            z: 3.14
        },
        modelType: 'gltf',
        modelName: '数字机床-1',
        position: {
            x: 46,
            y: 0,
            z: -4
        },
        base: {
            modelUrl: 'https://124.70.30.193:8443/model2/loadFileAsId/878966042'
        }
    },
    {
        rotation: {
            x: 0,
            y: 3.14,
            z: 0
        },
        modelType: 'gltf',
        modelName: '精雕机床-1',
        position: {
            x: -6,
            y: 0,
            z: -24
        },
        base: {
            modelUrl: 'https://124.70.30.193:8443/model2/loadFileAsId/701730674'
        }
    },
    {
        modelType: 'gltf',
        modelName: '非皮带传送带-1',
        position: {
            x: -22.421823174685755,
            y: 0,
            z: 19.607374310745982
        },
        base: {
            modelUrl: 'https://124.70.30.193:8443/model2/loadFileAsId/258642254'
        }
    },
    {
        modelType: 'gltf',
        modelName: '非皮带传送带-2',
        position: {
            x: 39.53851617816624,
            y: 0,
            z: 19.794253654138004
        },
        base: {
            modelUrl: 'https://124.70.30.193:8443/model2/loadFileAsId/258642254'
        }
    }
]

onMounted(() => {
    initScene()
})

function initScene() {
    // 初始化场景
    TO = new ThingOrigin('fileModel', document.getElementById('TO'), {
        helper: {
            // 辅助工具
            axes: {
                active: false
            },
            grid: {
                active: false
            }
        },
        camera: {
            // 相机配置
            position: {
                // 相机位置
                x: 0,
                y: 50,
                z: 200
            }
        }
    })

    //导入模型
    //使用批量加载方法
    TO.model.loadMultipleModels(modelList, (model, index) => {
        console.log(`模型 ${model.name} 加载完成,添加到场景`)
        TO.scene.add(model) //添加到场景
    })
}

function focusOn(index) {
    let model = TO.scene.getObjectByProperty('name', modelList[index].modelName) //获取模型
    TO.camera.focusOn(model) //聚焦模型
    console.log(TO.camera)
}

function lookAt(index) {
    TO.camera.lookAt(modelList[index].modelName, 2000, 2) //观察模型
}
</script>

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

#btn1 {
    position: absolute;
    top: 10px;
    right: 10px;
}

#btn2 {
    position: absolute;
    top: 10px;
    right: 125px;
}

#btn3 {
    position: absolute;
    top: 10px;
    right: 230px;
}
</style>

API 介绍

camera.focusOn

方法签名返回值描述
focusOn(model: Object3D)聚焦模型

参数说明:

参数名说明类型必填默认值
model模型Object3D-

camera.lookAt

方法签名返回值描述
lookAt(modelName: string, time: number, scaleRadius: number = 1)相机观察某物体

参数说明:

参数名说明类型必填默认值
modelName模型名称string-
time动画时长number-
scaleRadius相机观察距离number1