three.js学习(2)

134 阅读3分钟

3.使用three.js渲染第一个场景和物体

Scene:场景

Camera:相机(想象成我们的眼睛)

↑:相机拍摄的范围是一个锥体,我们叫做视锥体,距离相机太近的地方我们看不清、距离相机太远的地方我们也看不清。我们可以来设置这个视锥体,当然如果想要看到更多东西视锥体更大,那么性能就会消耗更多一些,反之亦然。

我们要实现一个基本的内容的话,我们需要:相机、场景、物体、渲染器,相机、物体都在场景当中。

three.js里面有一个场景类new THREE.Scene()

首先我们在main.js文件里搭建一个场景和相机:

 import * as THREE from 'three'
 
 //1.创建场景
 const scene = new THREE.Scene()
 
 //2.创建相机
 const camera = new THREE.PerspectiveCamera() //透视相机

在官网文档里,

可以看到透视相机的构造器:PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )

fov — 摄像机视锥体垂直视野角度 aspect — 摄像机视锥体长宽比 near — 摄像机视锥体近端面 far — 摄像机视锥体远端面

这些参数一起定义了摄像机的viewing frustum(视锥体)。

设置相机的位置并且把它添加到场景中。

 //设置相机对象的位置
 camera.position.set(0,0,10)//x,y,z轴
 scene.add(camera)          //把相机添加到场景当中

接下来是添加一个几何体。

首先定义几何体,再定义材质,有了这两样之后我们再创建几何体(Mesh)。

最基础的材质:基础网格材质(MeshBasicMaterial) 这种材质不受光照影响

 //添加物体
 //创建几何体
 const cubeGeometry = new THREE.BoxGeometry(1,1,1)                //几何体
 const cubeMaterial = new THREE.MeshBasicMaterial({color:0xfff00})//材质
 //根据几何体和材质去创建物体
 const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
 scene.add(cube)           //把几何体添加到场景中

那么相机场景什么的都有了,接下来就是初始化渲染器

 //初始化渲染器
 const renderer = new THREE.WebGLRenderer()
 //设置渲染尺寸大小
 renderer.setSize(window.innerWidth,window.innerHeight)

这个时候我们可以打印我们的renderer来看看,渲染器的domElement其实是往canvas画布上去添加,所以我们想要看到我们的图像需要将canvas对象添加到body上

 //将webgl渲染的canvas内容添加到body
 document.body.appendChild(renderer.domElement)
 
 //使用渲染器,通过相机将场景渲染进来
 renderer.render(scene, camera)

4.轨道控制器查看物体

Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。相当于一个卫星一样,那么它的参数有两个,在飞的是哪个相机、被围绕的是哪个物体(用于事件监听的HTML元素domElement)。

OrbitControls( object: Camera, domElement: HTMLDOMElement )

当然在这个时候,依旧是看不到我们移动了这个相机,因为呢在之前的代码中,我们使用渲染器渲染场景的步骤只有一个,那么当相机移动了之后,画面依然是原来渲染的那次,所以接下来我们需要做的就是:浏览器每渲染一帧,我们就调用一次渲染器渲染

 function render(){  //设置一个渲染函数
     renderer.render(scene, camera)
     //用一个浏览器自带的函数:请求动画帧requestAnimationFrame()
     requestAnimationFrame(render)//渲染下一帧的时候就会调用一次这个函数
 }
 
 render()//一开始执行一次

这时候我们就能够拖动并移动我们的立方体了~

5.添加坐标轴辅助器

AxesHelper:用于简单模拟3个坐标轴的对象。参数(可选)代表坐标轴的线段长度,默认为1

红色代表x轴,绿色代表y轴,蓝色代表z轴。

 //添加坐标轴辅助器
 const axesHelper = new THREE.AxesHelper(5)
 scene.add(axesHelper)