随着互联网技术的飞速发展,3D技术的应用越来越广泛。而three.js作为JavaScript编写的3D开发库,相对于其它3D技术而言,语言简洁,使用方便,功能强大,具有良好的扩展性,可在Web中快速创建并展示3D场景。那么,下面我们就来深入学习three.js,分享一些实用教程。
一、入门教程
在开始进入three.js的学习之前,我们首先要了解以下几个概念:
1. 场景(Scene)—— 这是three.js的重要概念之一,是three.js三维环境中的基础元素,包含了所有的3D物体、灯光和摄像机。
2. 相机(Camera)—— 这是用来定义场景的视角的3D物体,用于定义从哪个角度观察该场景。
3. 渲染器(Renderer)—— 用于将场景及其物体渲染并显示在页面中的控件,它可以使用多种渲染器,如CanvasRenderer、SVGRenderer、WebGLRenderer等。
4. 几何体(Geometry)—— 它定义了一个物体的形状,它们通常是由多个顶点以及连接这些顶点的线、面集合而成。
5. 材质(Material)—— 定义了物体在渲染时的外观,包括颜色、纹理、明暗等特性。
接下来,我们就可以开始进入three.js的学习了。我们可以通过以下两种方式来创建three.js项目:
1. 直接下载three.js文件并引入,然后在代码中创建场景、相机、渲染器等元素。
2. 基于Node.js的Webpack或者Browserify等打包工具,通过npm或yarn来安装three.js,并通过import或require来进行引用。这种方式相对于第一种方式,更加便捷。
在使用前,我们需要先引入three.js库,这可以通过以下方式进行:
```js
```
或
```js
import * as THREE from 'three';
```
接下来,我们就可以创建一个基本的three.js项目了:
```js
/* 创建场景 */
var scene = new THREE.Scene();
/* 在场景中添加一个立方体几何体 */
var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshBasicMaterial({color: 0xffff00});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
/* 创建相机 */
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
/* 创建渲染器 */
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
/* 渲染场景 */
function render() {
requestAnimationFrame(render);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
render();
```
运行代码后,我们将看到一个黄色的立方体在不断地旋转。
这个项目为我们提供了一个基本的three.js项目骨架,你可以在此基础上,按照自己的需求来添加更多的功能。
二、3D场景中的3D对象
在three.js中,每一个3D对象都是由Geometry和Material两个概念组合而成的。Geometry的作用是描述对象的形状,而Material则描述了对象其它的特征。
1. 通过几何体创建3D对象。
在three.js中,几何体是3D对象创建时必须的参数之一。常见的几何体包括BoxGeometry、SphereGeometry、CylinderGeometry等。
```js
/* 创建一个立方体 */
var geometry = new THREE.BoxGeometry(1, 1, 1);
/* 创建一个红色的材质 */
var material = new THREE.MeshBasicMaterial({color: 0xff0000});
/* 使用几何体和材质来创建一个立方体对象 */
var cube = new THREE.Mesh(geometry, material);
/* 将立方体对象添加到场景中 */
scene.add(cube);
```
2. 使用贴图来添加纹理。
three.js中通过TextureLoader来加载图片,并使用Texture作为Material的map属性来设置纹理。
```js
/* 创建一个平面几何体 */
var geometry = new THREE.PlaneGeometry(5, 5);
/* 创建纹理,并使用TextureLoader加载图片 */
var texture = new THREE.TextureLoader().load( 'textures/texture.png' );
/* 创建材质,并将纹理设置到map属性中 */
var material = new THREE.MeshBasicMaterial({ map: texture });
/* 创建3D对象 */
var plane = new THREE.Mesh(geometry, material);
/* 将3D对象添加到场景中 */
scene.add(plane);
```
3. 给3D物体添加光照
为了给3D物体添加阴影和高光效果,我们需要添加光源。
```js
/* 创建平面几何体 */
var geometry = new THREE.SphereGeometry(1, 32, 32);
/* 创建材质 */
var material = new THREE.MeshPhongMaterial();
/* 创建3D对象 */
var sphere = new THREE.Mesh(geometry, material);
/* 创建光源 */
var ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 环境光,增加物体的整体亮度
var pointLight = new THREE.PointLight(0xffffff, 1, 100); // 点光源,模拟聚光灯效果
/* 设置光源的位置 */
pointLight.position.set(2, 2, 2);
/* 将3D对象和光源添加到场景中 */
scene.add(sphere);
scene.add(ambientLight);
scene.add(pointLight);
```
三、探索three.js的更多功能
在three.js中,还有许多有趣、实用的功能等待我们去探索。比如,配合使用Tween.js库,我们可以为3D物体添加动画效果;让3D场景与外界交互,我们可以为控件添加鼠标事件等等。
1. 3D物体的动画效果
为了实现动画效果,我们需要将要改变的属性包裹进一个Tween的对象中,再通过调用.start()的方式来启动动画。
```js
/* 导入Tween.js库并创建Tween对象 */
import * as TWEEN from '@tweenjs/tween.js';
var tween = new TWEEN.Tween(cube.rotation);
/* 设置动画的起点和终点 */
tween.to({x: Math.PI * 2, y: Math.PI * 2}, 2000);
/* 开始动画 */
tween.start();
```
2. 鼠标交互
在three.js中,我们可以使用Raycaster进行路径检测,并判断出鼠标指向的哪一个3D物体。
```js
/* 给窗口绑定鼠标移动事件 */
function onMouseMove(event) {
/* 计算鼠标在屏幕中的位置 */
var mouseX = (event.clientX / window.innerWidth) * 2 - 1;
var mouseY = -(event.clientY / window.innerHeight) * 2 + 1;
/* 创建一个Raycaster对象 */
var raycaster = new THREE.Raycaster();
/* 设置射线起点和方向 */
raycaster.setFromCamera(new THREE.Vector2(mouseX, mouseY), camera);
/* 计算射线与物体相交的结果 */
var intersects = raycaster.intersectObjects(scene.children, true);
/* 检查是否与任意物体相交 */
if (intersects.length > 0) {
console.log(intersects); // 在控制台中输出相交结果
}
}
/* 绑定窗口事件 */
window.addEventListener('mousemove', onMouseMove, false);
```
通过上面的鼠标交互代码,我们可以在控制台中打印出鼠标位置下所有相交的3D物体信息。
四、总结
本文介绍了three.js的基本概念、几何体、材质、光照、动画效果、鼠标交互等多种功能。希望这些实用的教程可以帮助读者更好地学习three.js,并带来更多有趣的Web3D应用。