首页 前端知识 Three.js 入门篇

Three.js 入门篇

2025-02-24 13:02:44 前端知识 前端哥 564 231 我要收藏

一、Three.js 是什么

Three.js 是一款基于原生WebGL封装通用Web 3D引擎,在小游戏、产品展示、物联网、数字孪生、智慧城市园区、机械、建筑、全景看房、GIS等各个领域基本上都有three.js的身影

二、Three.js 快速入门

基础三部曲: 场景Scene、相机Camera、渲染器Renderer,了解以上三个基础概念后,使用官方案例,就可以构建一个基础的 3D 界面了

三、场景 Scene

场景内可以放置物体、布置光源等,物体可以是各种形状的、各种颜色的,材质也可以不一样,光源可以是不同类型的、不同颜色的,也可以布置在不同的位置

场景可以现象成你要构建的 3D 画面的舞台,你在舞台上放置各种不同种类的道具(物体),布置不同的光源达到不同的效果

  • 创建场景:使用THREE.Scene类可以创建一个3D场景,可以向场景中添加各种物体、光源和相机。
  • 创建物体:使用THREE.Mesh类可以创建一个物体,可以通过指定几何体和材质来定义物体的外观。
  • 几何体和材质:Three.js提供了许多内置的几何体和材质,如立方体、球体、平面等。可以使用这些几何体和材质,也可以自定义几何体和材质。
  • 光源:Three.js支持不同类型的光源,如环境光、平行光、点光源等。可以通过设置光源的位置和颜色来影响场景中物体的光照效果。

四、相机 Camera

相机就想象成现实的相机,在不同的位置、角度进行拍摄、录制,舞台(场景)呈现在相机中的效果就会不一样

相机也有不同种类,现实中比如专门拍人物的、专门拍风景的,功能专长不同,threejs 中的相机也是如此,不同的相机作用和效果不一样,但本质上都是相机

在Three.js中,可以使用不同类型的相机来创建不同的视角。下面是创建不同类型相机的几种常见方法:

  1. 透视相机(PerspectiveCamera):透视相机模拟了人眼的视觉效果,将物体看似透视到一个远离观察者的点。可以通过设置视场角(fov)、宽高比(aspect)、近裁剪面(near)和远裁剪面(far)来调整相机的视野范围。示例代码如下:
var camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
复制
  1. 正交相机(OrthographicCamera):正交相机将物体以平行的方式投影到屏幕上,不考虑物体到观察者的距离。可以通过设置left、right、top、bottom、近裁剪面(near)和远裁剪面(far)来调整相机的视野范围。示例代码如下:
var camera = new THREE.OrthographicCamera(left, right, top, bottom, near, far);
复制
  1. 立方体相机(CubeCamera):立方体相机是一种特殊的相机类型,可以同时渲染六个方向的立方体贴图。可以通过设置近裁剪面(near)和远裁剪面(far)来调整相机的视野范围。示例代码如下:
var camera = new THREE.CubeCamera(near, far, cubeResolution);
复制
  1. 首人称相机(FirstPersonControls):首人称相机模拟了人眼的视角,可以通过鼠标和键盘控制相机的移动和旋转。可以通过设置相机的位置、观察目标和旋转速度来调整相机的行为。示例代码如下:
var camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
var controls = new THREE.FirstPersonControls(camera);
复制

五、渲染器 Render

在Three.js中,渲染器(Renderer)是用来将场景中的物体和光源渲染到浏览器的画布上的组件。它负责计算出3D场景中物体的位置、颜色和光照效果,并将最终结果显示在屏幕上

可以简单理解为相机的洗相片功能,在你布置好舞台(场景),并在满意的位置对舞台(相机)进行拍摄录像后,你想将其导出为文件等呈现在你的电脑上,完成这个过程的就是渲染器

创建渲染器的步骤如下:

  1. 导入Three.js库:

    <script src="https://threejs.org/build/three.js"></script>
    复制
  2. 创建一个画布:

    <canvas id="canvas"></canvas>
    复制
  3. 初始化渲染器:

    const renderer = new THREE.WebGLRenderer({ canvas: document.getElementById('canvas') });
    复制

    这里使用了WebGLRenderer,它是Three.js中最常用的渲染器。如果浏览器不支持WebGL,还可以使用CanvasRenderer。

  4. 设置渲染器的大小:

    renderer.setSize(width, height);
    复制

    可以根据需要设置渲染器的宽度和高度,通常与画布的大小相同。

  5. 设置渲染器的背景色:

    renderer.setClearColor(color, alpha);
    复制

    可以设置渲染器的背景色,默认为黑色。

  6. 渲染场景:

    renderer.render(scene, camera);
    复制

    渲染器需要接收一个场景(Scene)和一个相机(Camera)来进行渲染。

通过以上步骤,你就可以成功创建一个Three.js渲染器并将场景渲染到画布上了。在Three.js中,渲染器(Renderer)是用来将场景中的物体和光源渲染到浏览器的画布上的组件。它负责计算出3D场景中物体的位置、颜色和光照效果,并将最终结果显示在屏幕上。

六、完整基础案例

HTML部分:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>My first three.js app</title>
<style>
body { margin: 0;color: #3376f1; background-color: #bfe3dd; }
</style>
</head>
<body>
<script type="importmap">
{
"imports": {
"three": "../../node_modules/three/build/three.module.js",
"three/addons/": "../../node_modules/three/examples/jsm/"
}
}
</script>
<script type="module" src="/index.js"></script>
</body>
</html>
复制

index.js 部分:

import * as THREE from "three";
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
// 创建一个场景
const scene = new THREE.Scene();
// 创建一个相机
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
1,
1000
);
// 创建一个渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 创建一个立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 为立方体创建一个材质
const material = new THREE.MeshBasicMaterial({
color: 0x00ffff,
transparent: true, //开启透明
opacity: 0.5, //设置透明度
});
// 创建一个网格
const cube = new THREE.Mesh(geometry, material);
// 创建辅助坐标系
const axesHelper = new THREE.AxesHelper(150);
scene.add(axesHelper);
scene.add(cube);
camera.position.z = 5;
camera.position.x = 5;
cube.position.set(10, 0, 0);
// 设置相机控件轨道控制器OrbitControls
const controls = new OrbitControls(camera, renderer.domElement);
// 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景
controls.addEventListener("change", function () {
renderer.render(scene, camera); //执行渲染操作
});
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.005;
cube.rotation.y += 0.005;
renderer.render(scene, camera);
}
animate();
复制

说明:

代码中的辅助坐标系以及相机轨道控制器只是辅助作用,具体概念可以去官网了解或上手修改感受

转载请注明出处或者链接地址:https://www.qianduange.cn//article/20955.html
标签
webglthreejs
评论
发布的文章

C/C | 每日一练 (2)

2025-02-24 13:02:49

Linux性能监控工具汇总

2025-02-24 13:02:48

Python常见面试题的详解16

2025-02-24 13:02:48

QQ登录测试用例报告

2025-02-24 13:02:47

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!