一、介绍Three.js
Three.js是一个JavaScript库,它允许您在WebGL上创建和显示3D图形。 它在3D图形渲染中使用的模块化方法极大地简化了设置和维护3D场景的过程,它是创建高质量3D动画和交互式3D应用程序的理想选择。在Web上提供了很多有趣的方式来探索3D世界的机会。
二、在WebGL中探索三维模型
1. Three.js基础
在我们开始使用Three.js之前,让我们先了解一些基本概念。 Three.js主要由Scene、Mesh、Material和Light组成。 Scene包含着所有我们需要渲染的3D对象,Mesh 定义了各个3D对象, Material用于确定物体的表面和颜色,而 Light 用于在场景中照亮这些物体。通过创建这些元素,我们可以构建自己独特的3D场景。
下面的代码片段用最简单的代码来创建一个场景,并在其中创建一个立方体:
//创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
//创建场景
const scene = new THREE.Scene();
//创建立方体
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const cube = new THREE.Mesh( geometry, material );
scene.add( cube );
//渲染
renderer.render( scene, camera );
这段代码首先通过Three.js中的WebGLRenderer创建了一个渲染器实例。 然后,它创建了一个场景的实例并在其中放置一个立方体。最后,场景和摄影机一起渲染了这个立方体。
2. 导入模型
导入一个模型可以更快速、方便的将您的创意想法转化成现实。 Three.js提供了一些支持从多种文件格式导入的工具,其中包括OBJ、STL、Collada,FBX等。
例如,下面的代码允许我们从OBJ文件中导入一个模型,然后在我们的场景中显示出来:
//导入模型
const loader = new THREE.OBJLoader();
loader.load( 'path/to/model.obj', function ( object ) {
scene.add( object );
} );
这个代码片段中,我们先创建了一个OBJLoader实例,然后使用它来加载指定路径的OBJ模型。 在加载完成之后,我们通过将它添加到我们的场景中来呈现它。
3. 添加动画
Three.js让你可以创建各种3D动画来使你的场景更加生动。 通过使用 JavaScript,您可以编写动画代码控制对象的运动和形态。
例如,下面的代码将创建一个旋转动画并将其应用于立方体对象:
// 创建一个动画函数
function rotateCube() {
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
}
// 添加到animation loop,维持动画进行
function animate() {
requestAnimationFrame( animate );
rotateCube();
renderer.render( scene, camera );
}
animate();
这里我们定义了一个名为rotateCube()的函数,并将其应用于立方体。当被渲染循环调用时,该函数调整立方体的方向。 通过将animate()函数添加到requestAnimationFrame()函数中,我们实现了每帧调用一次来维持动画的循环运行。然后通过调用render()函数渲染到画布上,从而实现了动画的附着。
三、使用 Three.js 的实例
随着 Three.js 的普及,现在越来越多的客户端使用 Three.js 来实现他们的 3D 创意。 下面是一个 Three.js 实现例子:
1.我们创建一个3D场景,加入几个物品(这里我们加入的是一个特殊的地球)
const shape = new THREE.SphereGeometry(100, 50, 50);
const shapeMaterial = new THREE.MeshStandardMaterial({color: 0xffffff})
const sphere = new THREE.Mesh(shape, shapeMaterial);
scene.add(sphere);
2.我们添加一些基本光源
function addLights() {
const light = new THREE.PointLight(0xe3e3e3);
light.position.set(250, 250, 250);
scene.add(light);
const ambientLight = new THREE.AmbientLight(0x585858);
scene.add(ambientLight);
}
addLights();
3.创建照相机,以及前、后裁剪平面
function initCameras() {
const aspectRatio = window.innerWidth / window.innerHeight;
const cameraWidth = 350;
const cameraHeight = cameraWidth / aspectRatio;
const ortographicCamera = new THREE.OrthographicCamera(
cameraWidth / -2,
cameraWidth / 2,
cameraHeight / 2,
cameraHeight / -2,
-10,
5000
);
ortographicCamera.position.set(0, 0, 200);//远离地球一定距离
camera = ortographicCamera;
scene.add(camera);
}
initCameras ();
4.加入渲染器,并设置其应用的位置
const orbitControls = new THREE.OrbitControls(camera, renderer.domElement);
orbitControls.enableDamping = true;
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
5.然后添加动画。这里我们定义一个 animate()函数来监听位移,按帧渲染
const animate = function() {
requestAnimationFrame( animate );
sphere.rotation.y += 0.005;
renderer.render( scene, camera );
};
animate();
6.最后完整代码如下:
var scene = new THREE.Scene(),
camera,
renderer = new THREE.WebGLRenderer(),
orbitControls,
cameraControls;
function addLights() {
const light = new THREE.PointLight(0xe3e3e3);
light.position.set(250, 250, 250);
scene.add(light);
const ambientLight = new THREE.AmbientLight(0x585858);
scene.add(ambientLight);
}
function initCameras() {
const aspectRatio = window.innerWidth / window.innerHeight;
const cameraWidth = 350;
const cameraHeight = cameraWidth / aspectRatio;
const ortographicCamera = new THREE.OrthographicCamera(
cameraWidth / -2,
cameraWidth / 2,
cameraHeight / 2,
cameraHeight / -2,
-10,
5000
);
ortographicCamera.position.set(0, 0, 200);//远离地球一定距离
camera = ortographicCamera;
scene.add(camera);
}
function addEarth() {
const shape = new THREE.SphereGeometry(100, 50, 50);
const shapeMaterial = new THREE.MeshStandardMaterial({color: 0xffffff})
const sphere = new THREE.Mesh(shape, shapeMaterial);
scene.add(sphere);
}
function init() {
addEarth();
addLights();
initCameras();
orbitControls = new THREE.OrbitControls(camera, renderer.domElement);
orbitControls.enableDamping = true;
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const animate = function() {
requestAnimationFrame( animate );
sphere.rotation.y += 0.005;
renderer.render( scene, camera );
};
animate();
}
init();
这样我们就完成了一个较为简单的 Three.js 应用。您可以在这个基础上增加您自己的创意,仿照这个步骤添加更多的3D物件、灯光和动画。
四、结论
Three.js 已经为我们提供了非常直观的控制界面,我们只需要做的就是使用这些工具来创造自己的3D应用程序。使用 Three.js,我们可以创建出更加逼真的模型和视觉效果,甚至可以探索3D世界的秘密。