美文网首页
three.js(30)-模型视角

three.js(30)-模型视角

作者: 姜治宇 | 来源:发表于2023-01-08 16:32 被阅读0次

当模型动起来时,如何切换到模型的视角呢?
导出的模型里面不仅有场景,还有相机等元素,因此我们只需把这个相机给到全局相机即可。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="http://www.yanhuangxueyuan.com/threejs/build/three.min.js"></script>
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js"></script>
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/loaders/GLTFLoader.js"></script>
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/loaders/DRACOLoader.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/gsap.min.js"></script>
</head>

<body>
    <div id="webgl"></div>

</body>

</html>
<script>
    var camera, scene, renderer;
    let redcar = null;//红色跑车
    let curve = null;//运行轨迹
    init();
    function init() {
        //场景
        scene = new THREE.Scene();

        camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        camera.position.set(0, 0, 100);
        scene.add(camera);//添加相机

        //添加坐标轴
        var axes = new THREE.AxesHelper(500);//500表示xyz轴的长度,红:x,绿:y,蓝:z
        scene.add(axes);

        addGlb('./model/city.glb');
        render();
        animate();
    }

    async function addGlb(filepath) {
        const loader = new THREE.GLTFLoader();
        const dracoloader = getDracoLoader();
        loader.setDRACOLoader(dracoloader);//注入loader

        const city = await loadGlb(filepath, loader);

        scene.add(city.scene);
        city.scene.traverse(child => {

            if (child.name === 'redcar') {
                redcar = child;//设定跑车
            }
            if (child.name === '汽车园区轨迹') {
                //跑车轨迹
                const line = child;
                const points = [];
                line.visible = false;
                for (let i = line.geometry.attributes.position.count - 1; i >= 0; i--) {
                    points.push(new THREE.Vector3(
                        line.geometry.attributes.position.getX(i),
                        line.geometry.attributes.position.getY(i),
                        line.geometry.attributes.position.getZ(i)
                    ))
                }
                curve = new THREE.CatmullRomCurve3(points, false);//创建曲线,不闭合
                carAnimation();//运行动画
            }
            city.cameras.forEach(v => {

                //切换相机到跑车视角
                if (v.name === 'carcamera_Orientation') {
                    camera = v;
                }
            })

        });

    }
    //动画
    function carAnimation() {
        let curveProgess = 0;
        gsap.to(null, {

            duration: 50,
            repeat: -1,
            onUpdate: () => {

                if (curveProgess >= 1) {
                    curveProgess = 0;
                }
                let point = curve.getPoint(curveProgess)
                // 让汽车运动
                redcar.position.set(point.x, point.y, point.z)
                curveProgess += 0.001;
                // 朝向下一个点
                point = curve.getPoint(curveProgess);

                redcar.lookAt(point);


            }
        })
    }
    function getDracoLoader() {
        //对模型解压
        const dracoloader = new THREE.DRACOLoader();
        dracoloader.setDecoderPath("./draco/");//把examples\jsm\libs\draco这个文件夹复制过来
        dracoloader.setDecoderConfig({ type: "js" })
        dracoloader.preload();
        return dracoloader;
    }
    function loadGlb(filepath, loader) {
        return new Promise((resolve, reject) => {

            loader.setCrossOrigin('Anonymous');//跨域问题
            loader.load(filepath, (gltf) => {
                console.log('gltf>>>', gltf);
                //处理材质丢失的情况
                gltf.scene.traverse(child => {
                    if (child.isMesh) {
                        child.material.emissive = child.material.color;
                        child.material.emissiveMap = child.material.map;
                    }
                });
                resolve(gltf);
            }, undefined, (error) => {

                console.error(error);
                reject(error);

            });
        });
    }
    function render() {
        renderer = new THREE.WebGLRenderer({
            antialias: true,
            alpha: true
        });//画布
        renderer.setSize(window.innerWidth, window.innerHeight);//设置渲染区域尺寸
        renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色

        document.getElementById('webgl').appendChild(renderer.domElement);



        var controls = new THREE.OrbitControls(camera, renderer.domElement);


        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;

            camera.updateProjectionMatrix();

            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.setPixelRatio(window.devicePixelRatio);



        });
    }

    function animate() {

        renderer.render(scene, camera);//开始渲染

        requestAnimationFrame(animate);

    }


</script>
GIF 2023-1-9 16-32-04.gif

相关文章

  • three.js(30)-模型视角

    当模型动起来时,如何切换到模型的视角呢?导出的模型里面不仅有场景,还有相机等元素,因此我们只需把这个相机给到全局相...

  • Three.js模型隐藏或显示

    Three.js模型隐藏或显示 个人技术博客 你在使用Three.js开发项目的过程中,可能需要隐藏一个模型,或者...

  • Three.js模型标签

    Three.js模型标签 在很多的实际的项目中,你可能需要给一个Three.js的模型添加标签,标签可以通过一个包...

  • 15three.js加载obj模型

    three.js加载obj模型 varscene =newTHREE.Scene(); varloader =ne...

  • Three.js跨域问题(无法预览)

    Three.js跨域问题 通过Three.js加载obj、FBX等格式外部模型文件的时候是ajax异步加载数据的过...

  • MTLLoader 报 Handlers.get() has b

    使用Three.js加载外部模型(OBJ,JSON...等格式的模型文件)。 上代码: yarn add thre...

  • 将不同格式的3d模型导入three.js

    three.js除了可以自己绘画3d模型以外,当然也是可以自己导入3d模型。官方提供了许多例子,多且难寻。于是体贴...

  • Cesium.js 初试

    今天讲下Cesium,说起来,用这个是因为模型,three.js用起来一直没有找到能加载模型的方法,所以就用Ces...

  • 用多视角审视问题,用多维度竞争

    用多视角审视问题,用多维度竞争 用多学科视角审视可以做的事情。 多学科视角被成为多元思维模型,思维模型是重要学科的...

  • three.js模型拖拽旋转

    通过判断鼠标像素坐标与模型中心点像素坐标进行计算角度(three.js版本125) mousedown(e){ t...

网友评论

      本文标题:three.js(30)-模型视角

      本文链接:https://www.haomeiwen.com/subject/plmucdtx.html