其他分享
首页 > 其他分享> > Threejs基本功能——实现自动旋转阴影的立方体

Threejs基本功能——实现自动旋转阴影的立方体

作者:互联网

写在前面:
初次接触Three.js,个人认为需要的几个网站地址如下。如果官网打不开,教大家一个办法(借助站长之家的一个工具:打开https://ping.chinaz.com/github.com ,输入你需要的地址,可以测速,然后在自己电脑的host中把你需要打开的地址配置上对应的ip即可)。

1、查看官网教程
2、下载Three.js源码可看里面的例子文件学习
3、自己动手试验Three.js相关api

Three.js的基本结构

Three.js 场景Scene\ 模型Mesh 几何体Geometry 材料Material 光Light 相机Camera 渲染器Renderer

Three.js实现一个基本功能的思路

一、初始化场景
初始化场景后,建立的模型、灯光需要添加到场景中才可以显示。

二、初始化相机

三、初始化渲染器

Three.js中开启阴影的设置步骤

开启阴影的步骤:
1、添加光源 (注意光源类型、方向)及相关的阴影设置,修改模型材质为MeshLamberMaterial MeshPhongMaterial 等支持反光的材质。
2、开启光源阴影设置 light.castShadow = true
3、开启渲染器阴影开关 renderer.shadowMap.enabled = true
4、开启模型阴影 ,包括 接受阴影的开关,制造阴影的开关。 mesh.castShadow = true \ plane.receiveShadow = true

Demo:使用Three.js实现一个旋转的带阴影的立方体


<template>
  <div>
    <div ref="picture" id="test"></div>
  </div>
</template>

<script>
import * as Three from 'three';

export default {
  data() {
    return {
      scene: null,
      camera: null,
      renderer: null,
      controls:null,
      mesh: null,
      plane: null,
      width: window.innerWidth,
      height: window.innerHeight
    }
  },
  mounted() {
    this.initScene()
    this.initCamera()
    this.initMesh()
    this.initPlane()
    this.initLight()
    this.initRenderer()
    this.animate()
  },
  methods: {
    // 初始化场景
    initScene() {
      this.scene = new Three.Scene();
    },
    // 初始化相机
    initCamera() {
      this.camera = new Three.PerspectiveCamera(45, this.width / this.height, 1, 1000);
      this.camera.position.set(-30, 40, 30) 
      this.camera.lookAt(this.scene.position) //设置相机对应的位置
    },
    // 初始化渲染器
    initRenderer() {
      this.renderer = new Three.WebGLRenderer({
        antialias: true // 开启后,渲染物体无锯齿
      });
      this.renderer.setClearColor(new Three.Color(0x000000)); // 设置渲染背景色
      this.renderer.setSize(this.width, this.height); // 设置渲染大小

      // 将渲染器加入到dom元素中
      this.$refs.picture.appendChild(this.renderer.domElement);
      //这种方式也可:
      // document.getElementById('test').appendChild(this.renderer.domElement)

      // 开启渲染器投影
      this.renderer.shadowMap.enabled = true;

    },
    // 初始化平面模型
    initPlane() {
      var plane = new Three.PlaneGeometry(60, 20);
      var material = new Three.MeshLambertMaterial({
        color: 0xAAAAA
      });
      this.plane = new Three.Mesh(plane, material);
      this.plane.rotation.x = - 0.5 * Math.PI
      this.plane.position.set(15, 0, 0)
      // 开启该模型接受投影
      this.plane.receiveShadow = true;

      this.scene.add(this.plane)
    },
    // 初始化立方体模型
    initMesh() {
      var cube = new Three.BoxGeometry(4, 4, 4)
      var material = new Three.MeshLambertMaterial({
        color: 0xFF0000 
      })
      this.mesh = new Three.Mesh(cube, material);
      this.mesh.position.set(-4, 3, 0)
      // 开启该模型产生投影
      this.mesh.castShadow = true;

      this.scene.add(this.mesh);
    },
    // 初始化灯光
    initLight() {
      let spotLight = new Three.SpotLight(0xffffff);
      spotLight.position.set(-40, 40, -15);
      // 开启灯光产生阴影 及相关设置
      spotLight.castShadow = true; 
      
      // 灯光 相关阴影的设置
      spotLight.shadow.mapSize.width = 1024;
      spotLight.shadow.mapSize.height = 1024;

      spotLight.shadow.camera.near = 40;
      spotLight.shadow.camera.far = 130;
      // spotLight.shadow.camera.fov = 10;
      
      this.scene.add(spotLight);
    },
    // 动态渲染
    animate() {
      this.mesh.rotation.x += 0.01
      this.mesh.rotation.y += 0.01
      this.mesh.rotation.z += 0.01
      this.renderer.render(this.scene, this.camera) // 渲染器执行渲染
      requestAnimationFrame(this.animate) // 自带的循环调用的方法
    }
  }
}
</script>

<style>

</style>


标签:初始化,Threejs,Three,js,基本功能,plane,立方体,new,spotLight
来源: https://blog.csdn.net/xiaozidewawa/article/details/123255516