zoukankan      html  css  js  c++  java
  • 【three.js第六课】物体3D化

    1.在【three.js第五课】的基础上引入AnaglyphEffect.js文件。

    文件路径:

    three源码包中进入【examples】文件夹;

    进入【js】文件夹;

    进入【effects】文件夹中即可看到AnaglyphEffect.js文件

    我的引入如下:

     <script src="../examples/js/effects/AnaglyphEffect.js"></script>

    2.将自定义的材料更改为如下(此步骤只是为了让材料收到光线的影响,不做该步骤也可以):

     var cubeMaterial = [
                //
                new THREE.MeshLambertMaterial({color:0xFFFFFF,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/2.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/3.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/4.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/5.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/6.png') ,side:THREE.DoubleSide})
     
            ];

    3.将物体3D化。添加一下代码:

    //物体3D化
            var effect = new THREE.AnaglyphEffect(renderer);
            effect.setSize(window.innerWidth, window.innerHeight);

    4.并将渲染画面的方法进行修改,修改如下:

     //绘画渲染
            var render=function() {
                //renderer.render(scene,camera);
                effect.render(scene,camera);//渲染3D画面
            }

    5.源码如下:

    <!DOCTYPE html>
    <html>
    <head>
        <title>demo1</title>
    </head>
    <style type="text/css">
       body{
            margin:0;
       }
       canvas{
            100%;
            height:100%;
       }
    </style>
    <body>
        <script src="jquery.min.js"></script>
        <script src="../src/loaders/ObjectLoader.js"></script>
        <script src="../build/three.js"></script>
        <script src="../examples/js/controls/OrbitControls.js"></script>
        <script src="../examples/js/effects/AnaglyphEffect.js"></script>
        <script type="text/javascript"> 
            var scene = new THREE.Scene();//创建场景
            //创建一个摄像机对象
            var camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight, 0.1, 1000);
     
             //创建渲染器
            var renderer = new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth, window.innerHeight);
           
            document.body.appendChild(renderer.domElement);//渲染到浏览器
     
            //加入事件监听器,窗口自适应
            window.addEventListener('resize', function(){
                var width = window.innerWidth;
                var height = window.innerHeight;
                renderer.setSize(width,height);
                camera.aspect = width/height;
                camera.updateProjectionMatrix();
            })
     
            //轨道控制 镜头的移动
            var controls = new THREE.OrbitControls(camera,renderer.document);
     
            //创建形状 BoxGeometry
            var geometry = new THREE.BoxGeometry(1,1,1);
     
           
            //自定义材料
            //map:用于设置纹理贴图,也可以用16进制的颜色替换:color:0xFFFFFF
            //side:用于设置显示面。属性可设置为双面DoubleSide,前面FontSide,后面BackSide
            //MeshBasicMaterial:基础网孔材料,一个以简单着色(平面或线框)方式来绘制几何形状的材料。
            //MeshLambertMaterial:兰伯特网孔材料,一种非发光材料(兰伯特)的表面
            //MeshPhongMaterial:网孔材料,用于表面有光泽的材料,计算每个像素。
            var cubeMaterial = [
                //
                new THREE.MeshLambertMaterial({color:0xFFFFFF,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/2.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/3.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/4.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/5.png') ,side:THREE.DoubleSide}),
                //
                new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('images/6.png') ,side:THREE.DoubleSide})
     
            ];
     
            //创建材料   wireframe是否使用线条
            //var material = new THREE.MeshBasicMaterial({color:0xFFFFFF,wireframe:true});
            var material = new THREE.MeshFaceMaterial(cubeMaterial);
     
            //将材料和形状结合
            var cube = new THREE.Mesh(geometry,material);
            
            //物体加入场景中
            scene.add(cube);       
     
     
            //添加光线
            //注意:材料收到光线影响,即不同的材料对不同的光线表现出不同的特点,试着该表材料和光线,观测结果
            //1.    AmbientLight  环境光:这种光的颜色被应用到全局范围内的所有对象。
            //AmbientLight(光线的颜色,光线的强度)
            //var ambientLight = new THREE.AmbientLight(0xFFFFFF,3.0);
            //scene.add(ambientLight);//光线加入场景中
     
            //2.    PointLight 点光源 使用 MeshLambertMaterial 或 Phong网孔材料(MeshPhongMaterial) 来影响对象
            //var pointLight = new THREE.PointLight(0xFFFFFF,3.0);
            //scene.add(pointLight);//光线加入场景中
     
            //3.    平行光源(DirectionalLight).影响使用 兰伯特网孔材料(MeshLambertMaterial) 或 Phong网孔材料(MeshPhongMaterial) 的对象。
            //var directionalLight = new THREE.DirectionalLight(0xFFFFFF,3.0);
            //scene.add(directionalLight);//光线加入场景中
     
            //4.    聚光光源(SpotLight)一种能投射锥形阴影区域的点光源。 使用 MeshLambertMaterial 或 Phong网孔材料(MeshPhongMaterial) 来影响对象。
            //var spotLight = new THREE.SpotLight(0xFFFFFF,3.0);
            //scene.add(spotLight);//光线加入场景中
     
            //5.    光(Light)光源的基类。
            var light = new THREE.Light(0xFFFFFF,1.0);
            scene.add(light);//光线加入场景中
     
     
            //物体3D化
            var effect = new THREE.AnaglyphEffect(renderer);
            effect.setSize(window.innerWidth, window.innerHeight);
     
            camera.position.z=3;//设置相机的位置
     
     
            //逻辑
            var update=function(){
                //物体随着XY轴旋转
                //cube.rotation.x +=0.01;
                //cube.rotation.y += 0.005;
            }
     
            //绘画渲染
            var render=function() {
                //renderer.render(scene,camera);
                effect.render(scene,camera);//渲染3D画面
            }
     
            //循环运行update,render
            var loop=function() {
                 requestAnimationFrame(loop);
                 update();
                 render();
            }
     
            loop();//循环开始
        </script>
    </body>
    </html>
  • 相关阅读:
    Linux下高并发socket最大连接数所受的各种限制
    Oracle DB 使用资源管理
    Oracle DB 资源管理
    C++ 封装私有堆(Private Heap)
    用宏实现 C++ Singleton 模式
    基于 crt debug 实现的 Windows 程序内存泄漏检测工具
    如何养成良好的 C++ 编程习惯 —— 内存管理
    OCP-1Z0-053-V12.02-643题
    Oracle DB 通过SQL 优化管理性能
    OCP-1Z0-052-V8.02-141题
  • 原文地址:https://www.cnblogs.com/smedas/p/12456326.html
Copyright © 2011-2022 走看看