Three.js入门基础概念

351 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

前言

Three.js作为Web前端开发的炫技框架之一,在开发使用时经常被提及到。

本篇内容,初步带领了解Three.js的核心概念

什么是Three.js

什么是Three.js?

Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。

在数据化需求日益增长的这个时代,数据的展示多样化也逐渐繁杂。Three.js作为Web界面的3D可视化引擎,通过Web的方式展示数据/产品。

使用Three.js

Three.js主要基于三个基本点场景(scene)、相机(camera)、渲染器Renderder

threejs9threejs.png

下面, 基于这三点我们依次初步使用下。

场景(scene)

这里的场景指的是一个三维空间,里面承载着我们使用Three.js渲染的所有图像,可以把场景看作一个摄影棚,里面呈现的就是我们的物体、相机、光源等。

实际情况中我们通过Three.jsTHREE.Scene类构建,代码书写如下👇

/**
         * 创建场景对象Scene
         */
        const scene = new THREE.Scene();

场景作为我们使用three.js必要的第一步,有了场景,我们接下来才能往场景里添加物体。例如长方形,矩形,球形等。

相机(camera)

由于three.js构建出来的场景3D的,在平面的屏幕中无法展现所有面。我们就当前面向屏幕的这面叫做内容,而相机就是用来呈现这个内容的。通过相机我们可以通过修改位置、方向、角度来获取/改变我们在屏幕上呈现的内容。

three.js中关于相机的实例创建有俩种方案:

  • 正射投影相机OrthographicCamera
  • 透视投影相机PerspectiveCamera

正射投影透视投影有什么区别呢?

对于正射投影而言,一条直线放置的角度不同,投影在投影面上面的长短不同;

对于透视投影而言,投影的结果除了与几何体的角度有关,还和距离相关, 人的眼睛观察世界就是透视投影,比如你观察一条铁路距离越远你会感到两条轨道之间的宽度越小。

正射投影相机创建代码👇

/**
 * 正投影相机设置
 */
var width = window.innerWidth; //窗口宽度
var height = window.innerHeight; //窗口高度
var k = width / height; //窗口宽高比
var s = 150; //三维场景显示范围控制系数,系数越大,显示的范围越大
//创建相机对象
var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
camera.position.set(200, 300, 200); //设置相机位置
camera.lookAt(scene.position); //设置相机方向(指向的场景对象)

透视投影相机创建代码👇

/**
 * 透视投影相机设置
 */
var width = window.innerWidth; //窗口宽度
var height = window.innerHeight; //窗口高度
/**透视投影相机对象*/
var camera = new THREE.PerspectiveCamera(60, width / height, 1, 1000);
camera.position.set(200, 300, 200); //设置相机位置
camera.lookAt(scene.position); //设置相机方向(指向的场景对象)

渲染器Renderder

渲染器就是在Web页面呈现前的最后一步,通过指定渲染区域(特点的dom节点对象),并结合之前我们所设置的场景以及相机

let renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);//设置渲染区域尺寸
renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
document.body.appendChild(renderer.domElement); //body元素中插入canvas对象
renderer.render(scene, camera);//执行渲染操作

尾声

以上就为three.js的基本概念,其实还有许多重要的元素也还没有阐述。比如灯光,动画,交互操作等,希望在后期我会整理出来🤡