美文网首页
three 简单模板

three 简单模板

作者: 半夜成仙 | 来源:发表于2020-09-25 11:38 被阅读0次

    Three.js的核心五步就是:

    1.设置three.js渲染器
    2.设置摄像机camera
    3.设置场景scene
    4.设置光源light
    5.设置物体object

    1.设置three.js渲染器

    三维空间里的物体映射到二维平面的过程被称为三维渲染。 一般来说我们都把进行渲染操作的软件叫做渲染器。 具体来说要进行下面这些处理。

    (1) 声明全局render对象;
    (2) 获取画布的高和宽;
    (3) 生成渲染器对象
    (4) 指定渲染器的高宽(一般跟画布框大小一致);
    (5) 追加canvas元素到body元素中;
    (6) 设置渲染器的清除色。

     /**
         * 创建渲染器对象
         */
        var renderer;
    
        function initThree() {
            renderer = new THREE.WebGLRenderer(); //生成渲染器对象,锯齿效果设置为有效
            renderer.setSize(window.innerWidth, window.innerHeight); //设置渲染器的高宽
            renderer.setClearColor(0xFFFFFF, 1.0); //设置canvas背景色
            document.body.appendChild(renderer.domElement); //body元素中插入canvas对象
        }
    
    

    2.设置摄像机camera

    OpenGL(WebGL)中、三维空间中的物体投影到二维空间的方式中,存在透视投影和正投影两种相机。 透视投影就是、从视点开始越近的物体越大、远处的物体绘制的较小的一种方式、和日常生活中我们看物体的方式是一致的。 正投影就是不管物体和视点距离,都按照统一的大小进行绘制、在建筑和设计等领域需要从各个角度来绘制物体,因此这种投影被广泛应用。在Three.js也能够指定透视投影和正投影两种方式的相机。

    //设置相机
        var camera;
    
        function initCamera() {
            var width = window.innerWidth; //窗口宽度
            var height = window.innerHeight; //窗口高度
            var k = width / height; //窗口宽高比
            var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大
            //创建相机对象
            camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
            camera.position.set(200, 300, 200); //设置相机位置
            camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
        }
    
    

    3.设置场景scene

    场景就是一个三维空间。 用Scene类声明一个对象。

     /**
         * 创建场景对象Scene
         */
        var scene;
    
        function initScene() {
            scene = new THREE.Scene();
        }
    

    4.设置光源light

    OpenGL(WebGL)的三维空间中,存在点光源和聚光灯两种类型。 而且,作为点光源的一种特例还存在平行光源(无线远光源)。另外,作为光源的参数还可以进行 [环境光] 等设置。 作为对应, Three.js中可以设置 [点光源(Point Light)] [聚光灯(Spot Light)] [平行光源(Direction Light)],和 [环境光(Ambient Light)]。 和OpenGL一样、在一个场景中可以设置多个光源。 基本上,都是环境光和其他几种光源进行组合。 如果不设置环境光,那么光线照射不到的面会变得过于黑暗。 本文中首先按照下面的步骤设置平行光源,在这之后还会追加环境光。
    (1) 声明全局变量(对象)
    (2) 设置平行光源
    (3) 设置光源向量
    (4) 追加光源到场景
    这里我们用「DirectionalLight」类声明一个叫 [light] 的对象来代表平行光源。

    //设置光源
    var light;
    function initLight(){
        light = new THREE.DirectionalLight(0xff0000,1.0,0); //设置平行光源
        light.position.set(200,200,200);    //设置光源向量
        scene.add(light);   //追加光源到场景
    }
    

    5.设置物体object

     function initObject() {
            var geometry = new THREE.BoxGeometry(100, 100, 100);
            var material = new THREE.MeshLambertMaterial({
                color: 0xff0000,
                opacity: 1,
                transparent: true
            }); //材质对象Material
            var mesh1 = new THREE.Mesh(geometry, material); //网格模型对象Mesh
            scene.add(mesh1); //网格模型添加到场景中
        }
    

    下面是完整代码:

    <script>
        threeExcute()
    
        function threeExcute() {
            initScene();
            // 辅助坐标系  参数250表示坐标系大小,可以根据场景大小去设置
            var axisHelper = new THREE.AxisHelper(250);
            scene.add(axisHelper);
            initThree();
            initCamera();
            initLight();
            initObject();
            renderer.clear();
            render();
            var controls = new THREE.OrbitControls(camera, renderer.domElement); //创建控件对象
            controls.addEventListener('change', render); //监听鼠标、键盘事件
        }
        /**
         * 创建场景对象Scene
         */
        var scene;
    
        function initScene() {
            scene = new THREE.Scene();
        }
        /**
         * 创建渲染器对象
         */
        var renderer;
    
        function initThree() {
            renderer = new THREE.WebGLRenderer(); //生成渲染器对象,锯齿效果设置为有效
            renderer.setSize(window.innerWidth, window.innerHeight); //设置渲染器的高宽
            renderer.setClearColor(0xFFFFFF, 1.0); //设置canvas背景色
            document.body.appendChild(renderer.domElement); //body元素中插入canvas对象
        }
        //设置相机
        var camera;
    
        function initCamera() {
            var width = window.innerWidth; //窗口宽度
            var height = window.innerHeight; //窗口高度
            var k = width / height; //窗口宽高比
            var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大
            //创建相机对象
            camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
            camera.position.set(200, 300, 200); //设置相机位置
            camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
        }
    
        //执行渲染操作   指定场景、相机作为参数
        // 渲染函数
        function render() {
            renderer.render(scene, camera); //执行渲染操作
        }
    
        /**
         * 创建网格模型
         * 
         */
        function initObject() {
            var geometry = new THREE.BoxGeometry(100, 100, 100);
            var material = new THREE.MeshLambertMaterial({
                color: 0xff0000,
                opacity: 1,
                transparent: true
            }); //材质对象Material
            var mesh1 = new THREE.Mesh(geometry, material); //网格模型对象Mesh
            scene.add(mesh1); //网格模型添加到场景中
        }
        /**
         * 光源设置
         */
        function initLight() {
            var light = new THREE.DirectionalLight(0xff0000, 1.0, 0); //设置平行光源
            light.position.set(200, 200, 200); //设置光源向量
            scene.add(light); //追加光源到场景
        }
    </script>
    

    相关文章

      网友评论

          本文标题:three 简单模板

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