系列文章目录
系列文章目录
系列文章目录
Three.js 快速入门教程【一】开启你的 3D Web 开发之旅
Three.js 快速入门教程【二】透视投影相机
Three.js 快速入门教程【三】渲染器
Three.js 快速入门教程【四】三维坐标系
Three.js 快速入门教程【五】动画渲染循环
Three.js 快速入门教程【六】相机控件 OrbitControls
Three.js 快速入门教程【七】常见几何体类型
Three.js 快速入门教程【八】常见材质类型
Three.js 快速入门教程【九】光源类型
Three.js 快速入门教程【十】常见的纹理类型
Three.js 快速入门教程【十一】天空盒的多种实现方式
Three.js 快速入门教程【十二】外部模型加载
Three.js 快速入门教程【十三】外部模型加载后常见的处理操作
Three.js 快速入门教程【十四】使用Stats.js监控渲染帧率和性能优化
Three.js 快速入门教程【十五】交互神器DragControls使用详解,实现对物体或模型拖拽
Three.js 快速入门教程【十六】调试神器 gui.js使用详解,可视化面板控制场景参数提高开发效率
Three.js 快速入门教程【十七】射线拾取模型——射线与射线投射器Raycaster介绍
Three.js 快速入门教程【十八】射线拾取模型——鼠标点击屏幕选中模型或物体
Three.js 快速入门教程【十九】CSS2D渲染器介绍,实现场景中物体或设备标注标签信息
Three.js 快速入门教程【二十】三维模型优化实战:使用gltf-pipeline与Draco对模型进行压缩,提高加载速度和流畅性
Three.js 快速入门教程【二十一】CSS3D渲染器(CSS3DRenderer、CSS3DObject 、CSS3DSprite)介绍,实现场景中物体标注标签信息
Three.js 快速入门教程【二十二】动画神器Tween.js使用指南
一、前言
在 Three.js 创建的 3D 虚拟世界中,相机是我们观察场景的窗口。而透视投影相机(PerspectiveCamera)是 Three.js 里常用的相机类型之一,它模拟了人眼观察物体的方式,即近大远小,能为场景带来逼真的深度感。本篇文章将介绍透视投影相机在 Three.js 中的使用。
二、创建透视投影相机
// 创建一个透视相机
const camera = new THREE.PerspectiveCamera(
75, // 视场角(FOV)
window.innerWidth / window.innerHeight, // 宽高比
0.1, // 近裁剪面
2000 // 远裁剪面
);
PerspectiveCamera( fov, aspect, near, far )参数介绍:
参数 | 说明 | 默认值 |
---|---|---|
fov | 视野角度(Field of View),指垂直方向上的视角,单位是度。通常设置为 45 - 75 度,类似人眼的视角范围,能让场景看起来自然。数值越大,视角越广,场景中的物体看起来越小;数值越小,视角越窄,物体看起来越大 | 50 |
aspect | 宽高比,即渲染区域的宽度与高度之比。一般设置为Canvas画布宽高比width / height,确保场景在不同尺寸屏幕上正确显示 | 1 |
near | 近裁剪面,相机能看到的最近距离。小于此距离的物体不会被渲染。设置过小可能导致近处物体出现闪烁或错误,需根据场景大小合理调整 | 0.1 |
far | 远裁剪面,相机能看到的最远距离。大于此距离的物体不会被渲染。设置过大可能影响性能,因为 GPU 需要处理更多远处的物体。 | 2000 |
ps:表格中提到的Canvas画布指的是3d场景在网页上渲染的dom节点,它是个canvas,可通过渲染器的domElement属性获取。
//创建渲染器
const renderer = new THREE.WebGLRenderer();
//获取dom
const canvas=renderer.domElement
三、位置设置
改变相机在3D场景中位置
1、通过camera.position.set(x,y,z),其中x,y,z分别代表3维坐标系中x轴、y轴、z轴坐标向量
camera.position.set(5, 10, 30);
2、通过camera.position.属性设置,camera.position是一个THREE.Vector3对象(三维向量),有x、y、z三个属性
camera.position.x = 5;
camera.position.y = 10;
camera.position.z = 30;
ps:相机默认位置在原点(0,0,0)
四、方向控制
设置相机方向,使得它的正前方指向某个方向。
通过camera.lookAt(x,y,z),让相机看向某个点
camera.lookAt(0,10,30);
或传入一个三维向量对象
const target = new THREE.Vector3( 0, 10, 30 );
camera.lookAt( target );
看向场景中一个物体:
const mesh= new THREE.Mesh(
new THREE.BoxGeometry(1, 1, 1),
new THREE.MeshStandardMaterial({ color: 0x00ff00 })
);
scene.add(mesh);
camera.lookAt(mesh.position);
始终保持看向该物体:
function animate() {
requestAnimationFrame(animate);
camera.lookAt(mesh.position);
renderer.render(scene, camera);
}
animate();
ps:相机方向默认看向z轴负方向
知识点提前了解:z轴方向跟css z-index方向是一致的,人眼睛跟电脑屏幕垂直方向即为z轴,
向屏幕内为负,向屏幕外为正,屏幕宽方向为x轴,高方向为y轴
五、旋转相机
1、通过camera.rotation.set(x,y,z);
入参x,y,z以弧度为单位
// 设置相机绕z轴旋转45度(转换为弧度),x轴和y轴不旋转
camera.rotation.set(0,0,Math.PI / 4,);
2、通过rotation属性旋转相机
rotation属性包含三个值,分别是绕 X、Y、Z 轴的旋转角度(以弧度为单位)
//绕着x轴旋转45度
camera.rotation.x=Math.PI/4;
//绕着y轴旋转90度
camera.rotation.y=Math.PI/2;
//绕着z轴旋转60度
camera.rotation.z=Math.PI/3;
旋转顺序:默认XYZ(可通过camera.rotation.order修改)
camera.rotation.order='YZX';
六、牛刀小试
下面实现一个小案例:通过鼠标滚轮实现相机缩放功能
代码示例:
import * as THREE from "three";
//创建场景
const scene = new THREE.Scene();
//设置黑色背景色
scene.background = new THREE.Color(0x000000);
//创建一个球体
const geometry = new THREE.SphereGeometry(5);
//创建一个基础材质
const material = new THREE.MeshBasicMaterial({
color: "#ff00ff",
});
//创建一个网格对象
const mesh = new THREE.Mesh(geometry, material);
//设置网格对象位置
mesh.position.set(0, 0, 0);
//添加到场景中
scene.add(mesh);
//创建相机
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
//设置相机位置
camera.position.set(0, 10, 30);
//相机默认看向网格对象
camera.lookAt(mesh.position);
//创建渲染器
const renderer = new THREE.WebGLRenderer();
//设置渲染器尺寸为页面宽高
renderer.setSize(
document.documentElement.clientWidth,
document.documentElement.clientHeight
);
//将渲染器的 DOM 元素添加到页面中
document.body.appendChild(renderer.domElement);
// 循环动画
function animate() {
// 定时刷新
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
// 执行动画
animate();
//监听滚轮事件
window.addEventListener("wheel", (event) => {
const speed = 1;
if (event.deltaY > 0) {
//缩小
camera.position.z += speed;
} else {
//放大
camera.position.z -= speed;
}
});
运行效果:
说明:监听wheel事件,根据滚轮滚动方向调整相机的position.z值,position.z值越大相机离我们眼睛越近,离物体越远呈现视觉效果就是物体在缩小,反之在放大。
总结
透视投影相机是 Three.js 创建逼真 3D 场景的重要工具。通过掌握其创建、位置与方向控制以及与场景的交互,我们能为用户带来更丰富、沉浸式的 3D 体验。在实际应用中,需根据场景需求和用户体验,不断调整相机参数和交互逻辑,创造出令人满意的 3D 作品。
更多three.js入门知识点请关注该系列教程后续的更新。