THREE 1

177 阅读3分钟

尘劳迥脱事非常,紧把绳头做一场。

不经一番寒彻骨,怎得梅花扑鼻香。

three.js的学习之旅开始了。。。

实例:

 /**
      * 创建场景/模型并加入场景中
    */
    let scene = new THREE.Scene();  //创建场景

    /**
      *  更多几何体
    */
    // //长方体 参数:长,宽,高
    // var geometry = new THREE.BoxGeometry(100, 100, 100);
    // // 球体 参数:半径60  经纬度细分数40,40
    // var geometry = new THREE.SphereGeometry(60, 40, 40);
    // // 圆柱  参数:圆柱面顶部、底部直径50,50   高度100  圆周分段数
    // var geometry = new THREE.CylinderGeometry(50, 50, 100, 25);
    // // 正八面体
    // var geometry = new THREE.OctahedronGeometry(50);
    // // 正十二面体
    // var geometry = new THREE.DodecahedronGeometry(50);
    // // 正二十面体
    // var geometry = new THREE.IcosahedronGeometry(50);
    let geometry = new THREE.BoxGeometry(80, 80, 80);  // 创建几何对象
    let geometry1 = new THREE.SphereGeometry(60, 40, 40);
    let material = new THREE.MeshLambertMaterial({  //模型的材质
      color: 0xaabbff
    })
    let mesh = new THREE.Mesh(geometry, material)  //模型等于对象+材质
    let mesh1 = new THREE.Mesh(geometry1, material)  //第二个模型
    scene.add(mesh) //将模型加入到场景中
    scene.add(mesh1)

    mesh.position.x = 305;
    mesh.position.z = 0;
    mesh.position.y = 0;
    
    
    /**
      * 光源设置
    */
    // 点光源
    let point = new THREE.PointLight(0xffffff);
    
    // 确定光源的位置,这是设置的光源从背部开始照射,所以正面看到的模型会是比较黑的,
    // 注意不要把光源设置到模型里面,否则你将看不见点光源
    point.position.set(-400, -200, -300);
    
    scene.add(point);

    // 环境光
    let ambient = new THREE.AmbientLight(0x444444)
    scene.add(ambient);



    /**
      * 相机设置
    */
    // 窗口宽高/宽高比
    let width = window.innerWidth;
    let height = window.innerHeight;
    let k = width / height;
    let s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大

    // 创建相机对象
    let camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
    camera.position.set(200, 300, 200); //设置相机位置
    camera.lookAt(scene.position); //设置相机方向(指向的场景对象)


    /**
       * 创建渲染器对象
    */
    let renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height); //设置渲染的区域
    renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色

    document.getElementsByTagName('div')[0].appendChild(renderer.domElement);
    // renderer.render(scene, camera);

旋转动画和 requestAnimationFrame() 函数

 /**
      *  旋转动画和 requestAnimationFrame() 函数
      *  渲染函数,定时旋转模型,不断render渲染。成为旋转动画
    */
    // let T0 = new Date();//上次时间
    // function render() {
    //   let T1 = new Date();//本次时间
    //   let t = T1 - T0;//时间差
    //   T0 = T1;//把本次时间赋值给上次时间
    //   requestAnimationFrame(render);   // 用setinterval也行,但是不如这个函数优秀
    //   renderer.render(scene, camera);//执行渲染操作
    //   mesh.rotateY(0.001 * t);//每次绕y轴旋转0.01弧度

    // }
    // render()

鼠标操作三维场景旋转缩放: 需引入控件OrbitControls.js

 /**
      *  鼠标操作三维场景旋转缩放
    */
    function render() {
      renderer.render(scene, camera);
    }
    render();  //** 必须要render一下,重新渲染,否则下面的新加入场景的属性不生效
    
    let controls = new THREE.OrbitControls(camera, renderer.domElement)
    // ** 不可以和requestAnimationFrame函数共同使用,否则冲突
    controls.addEventListener('change', render);//监听鼠标、键盘事件

注:

render(); // 必须要render一下,重新渲染,否则下面的新加入场景的属性不生效,无论是旋转效果还是鼠标控制都是不断进行render渲染场景和摄像机的过程。**

坐标系

/**
   * 坐标轴
*/
let AxesHelper = new THREE.AxesHelper(650); // 坐标系的长度
scene.add(AxesHelper);

材质的常用属性

材质的属性设置

材质的配置1: 半透明效果

 
    let geometry2 = new THREE.OctahedronGeometry(100); // 要用新材质的第三个模型 

    // 材质的配置1: 半透明效果
    let material2 = new THREE.MeshLambertMaterial({
      color: 0xff88ff, //颜色
      opctiy: 0.5,  // 透明度
      transparent: true,  // 是否开启透明度,默认false
      wireframe: true, // 将几何图形渲染为线框。 默认值为false
    })
    let mesh2 = new THREE.Mesh(geometry2, material2);
    mesh2.position.set(200, 300, 200)
    scene.add(mesh2)

材质的配置2: 高光效果

  let geometry3 = new THREE.IcosahedronGeometry(100); // 模型4

    // 材质的配置2: 高光效果
    let material3 = new THREE.MeshLambertMaterial({
      color: 0xff88ff,
      specular: 0x4488ee,
      shininess: 12
    })
    let mesh3 = new THREE.Mesh(geometry3, material3);
    mesh3.position.set(0, 300, 200)
    scene.add(mesh3)

常用的其他材质

image.png

光照效果设置

    /**
       * 光照效果设置: 上面已经设置点光源、环境光
    */
    let spotLight = new THREE.SpotLight(0xff0000)
    scene.add(spotLight)