FHLP_WEB_3D

demo01

1、场景Scene

1)网络模型Mesh(几何对象Geometry、材质对象Material)

2)光照Light(平行光、环境光、点光源)

2、相机Camera

3、渲染器Renderer

<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>FHLP_WEB_3D demo01</title>
</head>
<body>
  <script type="module">
    // 引入Three.js
    import * as THREE from '../../FHLP_WEB_3D/three.js-r123/build/three.module.js';
    // 引入Three.js扩展库
    import { OrbitControls } from '../../FHLP_WEB_3D/three.js-r123/examples/jsm/controls/OrbitControls.js';
    /**
     * 创建场景对象Scene
     */
    var scene = new THREE.Scene();
    /**
     * 创建网格模型
     */
    var geometry1 = new THREE.BoxGeometry(500, 500, 2); //创建一个立方体几何对象Geometry
    // 材质对象Material
    var material = new THREE.MeshLambertMaterial({
      color: 0x008000,//材质颜色
    }); 
    var mesh1 = new THREE.Mesh(geometry1, material); //网格模型对象Mesh
    scene.add(mesh1); //网格模型添加到场景中

    // 长方体
    var geometry2 = new THREE.BoxGeometry(100, 100, 40);
    var material2 = new THREE.MeshLambertMaterial({
    color: 0x190FF
    });
    var mesh2 = new THREE.Mesh(geometry2, material2); //网格模型对象Mesh
    mesh2.position.set(200,20,20);//设置mesh2模型对象的xyz坐标为120,0,0
    scene.add(mesh2);
    // 长方体
    var geometry3 = new THREE.BoxGeometry(100, 100, 40);
    var material3 = new THREE.MeshLambertMaterial({
    color: 0x190FF
    });
    var mesh3 = new THREE.Mesh(geometry3, material3); //网格模型对象Mesh
    mesh3.position.set(200,180,20);//设置mesh2模型对象的xyz坐标为120,0,0
    scene.add(mesh3);
     // 长方体
    var geometry4 = new THREE.BoxGeometry(100, 100, 40);
    var material4 = new THREE.MeshLambertMaterial({
    color: 0x190FF
    });
    var mesh4 = new THREE.Mesh(geometry4, material4); //网格模型对象Mesh
    mesh4.position.set(200,-180,20);//设置mesh2模型对象的xyz坐标为120,0,0
    scene.add(mesh4);
     // 长方体
    var geometry5 = new THREE.BoxGeometry(100, 100, 40);
    var material5 = new THREE.MeshLambertMaterial({
    color: 0x190FF
    });
    var mesh5 = new THREE.Mesh(geometry5, material5); //网格模型对象Mesh
    mesh5.position.set(-200,20,20);//设置mesh2模型对象的xyz坐标为120,0,0
    scene.add(mesh5);
    // 圆柱体
    var geometry6 = new THREE.CylinderGeometry(50, 50, 100, 100);
    var material6 = new THREE.MeshLambertMaterial({
    color: 0xFFD700
    });
    var mesh6 = new THREE.Mesh(geometry6, material6); //网格模型对象Mesh
    mesh6.position.set(-200,180,50);//设置mesh2模型对象的xyz坐标为120,0,0
    scene.add(mesh6);
    // 圆柱体
    var geometry7 = new THREE.CylinderGeometry(50, 50, 100, 100);
    var material7 = new THREE.MeshLambertMaterial({
    color: 0xFFD700
    });
    var mesh7 = new THREE.Mesh(geometry7, material7); //网格模型对象Mesh
    mesh7.position.set(-200,-180,50);//设置mesh2模型对象的xyz坐标为120,0,0
    scene.add(mesh7);
    /**
    * 光源设置
    */
    // 平行光1
    var directionalLight = new THREE.DirectionalLight(0xffffff, 0.6);
    directionalLight.position.set(400, 200, 300);
    scene.add(directionalLight);
    // 平行光2
    var directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.6);
    directionalLight2.position.set(-400, -200, -300);
    scene.add(directionalLight2);
    //环境光
    var ambient = new THREE.AmbientLight(0xffffff, 0.6);
    scene.add(ambient);
    var axesHelper = new THREE.AxesHelper(600);
    scene.add(axesHelper);

    // width和height用来设置Three.js输出Canvas画布尺寸,同时用来辅助设置相机渲染范围
    var width = window.innerWidth; //窗口文档显示区的宽度
    var height = window.innerHeight; //窗口文档显示区的高度
    /**
    * 相机设置
    */
    var k = width / height; //Three.js输出的Canvas画布宽高比
    var s = 200; //控制相机渲染空间左右上下渲染范围,s越大,相机渲染范围越大
    //THREE.OrthographicCamera()创建一个正投影相机对象
    // -s * k, s * k, s, -s, 1, 1000定义了一个长方体渲染空间,渲染空间外的模型不会被渲染
    var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
    camera.position.set(200, 300, 200); //相机在Three.js坐标系中的位置
    camera.lookAt(0, 0, 0); //相机指向Three.js坐标系原点
    /**
     * 创建渲染器对象
     */
    var renderer = new THREE.WebGLRenderer({
      antialias: true, //开启锯齿
    });
    renderer.setPixelRatio(window.devicePixelRatio);//设置设备像素比率,防止Canvas画布输出模糊。
    renderer.setSize(width, height); //设置渲染区域尺寸
    renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
    // renderer.domElement表示Three.js渲染结果,也就是一个HTML元素(Canvas画布)
    document.body.appendChild(renderer.domElement); //body元素中插入canvas画布
    // 渲染循环
    function render() {
      // mesh.rotateY(0.01);//立方体绕y轴旋转动画
      renderer.render(scene, camera); //执行渲染操作
      requestAnimationFrame(render); //请求再次执行渲染函数render,渲染下一帧
    }
    render();

    //创建控件对象  控件可以监听鼠标的变化,改变相机对象的属性
    // 旋转:拖动鼠标左键
    // 缩放:滚动鼠标中键
    // 平移:拖动鼠标右键
    var controls = new OrbitControls(camera, renderer.domElement);
  </script>
</body>

</html>
posted @ 2022-10-10 19:38  Sophie_y  阅读(62)  评论(0)    收藏  举报