美文网首页
three.js(24)-场景元素遍历

three.js(24)-场景元素遍历

作者: 姜治宇 | 来源:发表于2023-01-02 13:55 被阅读0次

我们熟悉的scene.add方法,其实就是往一个容器里面添加元素.
既然是容器,那也肯定可以做遍历、查找和删除等操作。

<!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>
</head>

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

</body>

</html>
<script>
    //场景
    var scene = new THREE.Scene();
    //相机设置为世界坐标原点
    var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.set(0, 0, 300);
    scene.add(camera);//添加相机

     //添加坐标轴
     var axes = new THREE.AxesHelper(500);//500表示xyz轴的长度,红:x,绿:y,蓝:z
    scene.add(axes);
    for(let i=0;i<6;i++) {
        const cube = createMesh();
        cube.position.set(0, 0, 30*i);//设置物体的位置,正前方10米
        cube.name = `box-${i}`;
        scene.add(cube);//添加物体
    }
    function createMesh() {
        var geometry = new THREE.BoxGeometry(10, 10, 10);//几何体
        var material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });//材质
        var cube = new THREE.Mesh(geometry, material);//渲染管线
        return cube;
    }

    
    var renderer = new THREE.WebGLRenderer({
        antialias:true,
        alpha:true
    });//画布
    renderer.setSize(window.innerWidth, window.innerHeight);//设置渲染区域尺寸
    renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
    
    var controls = new THREE.OrbitControls(camera, renderer.domElement);
    //将渲染好的canvas追加到dom
    var cont = document.getElementById('webgl');
    cont.appendChild(renderer.domElement); 

    animate();

    function animate() {

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

    }
    console.log(scene.children);//场景中的所有对象,包括相机、坐标轴等
    //遍历场景
    for(let i=0;i<scene.children.length;i++) {
        const obj = scene.children[i];
        if(obj.type === 'Mesh') {
            obj.material.color.set('#0000ff');
        }
        
    }
    //寻找物体
    const box = scene.getObjectByName('box-1');
    box.material.color.set('#ff0000');
    //删除物体
    const lastbox = scene.children[scene.children.length -1];
    scene.remove(lastbox);
    
</script>

相关文章

网友评论

      本文标题:three.js(24)-场景元素遍历

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