- three.js的安装及使用
- 使用 Three.js 创建一个场景(Creating a Scene)
- 使用 Three.js 进行 WebGL 兼容性检查
- 使用 Three.js 进行线条绘制(Drawing Lines)
- 使用 Three.js 创建文字(Creating Text)
- 使用 Three.js 载入 3D 模型(Loading 3D Models)
- 使用 Three.js 更新场景(How to Update Things)
- 使用 Three.js 废置对象(How to Dispose of Objects)
- 使用 Three.js 创建 VR 内容(How to Create VR Content)
- 使用 Three.js 实现后期处理(How to Use Post-Processing)
- 使用 Three.js 进行矩阵变换(Matrix Transformations)
- 使用 Three.js 动画系统(Animation System)
- 使用 Three.js 框架中的 AnimationAction
- 使用 Three.js 框架中的 AnimationClip
- Three.js 框架中的 AnimationMixer 使用详解
- Three.js 框架中的 AnimationObjectGroup 使用详解
- Three.js 框架中的 AnimationUtils 使用详解
- Three.js 框架中的 KeyframeTrack 使用详解
- Three.js 框架中的 PropertyBinding 使用详解
- Three.js 框架中的 PropertyMixer 使用详解
- Three.js 框架中 BooleanKeyframeTrack 的使用详解
- Three.js 框架中 ColorKeyframeTrack 的使用详解
- Three.js 框架中的 NumberKeyframeTrack 使用详解
- Three.js 框架中的 QuaternionKeyframeTrack 使用详解
- Three.js 框架中的 StringKeyframeTrack 使用详解
- Three.js 框架中的 VectorKeyframeTrack 使用详解
- Three.js 框架中的音频(Audio)使用详解
- Three.js 框架中的音频分析器(AudioAnalyser)使用详解
- Three.js 框架中 `AudioContext` 的使用详解
- Three.js 框架中的 `AudioListener` 使用详解
- Three.js 框架中的 `PositionalAudio` 使用详解
- Three.js 框架中的 `ArrayCamera` 使用详解
- Three.js 框架中的 Camera 使用详解
- Three.js 中 CubeCamera 的使用详解
- Three.js 框架:`OrthographicCamera` 与音频的使用详解
- Three.js 中 PerspectiveCamera 的使用详解
- Three.js 框架中的 StereoCamera 使用详解
- Three.js 框架中的动画常量(Animation Constants)详解
- Three.js 框架中的常量——自定义混合方程常量(Custom Blending Equation Constants)详解
- Three.js 框架中的常量——Material Constants 使用详解
- Three.js 框架中的常量——WebGLRenderer Constants 使用详解
- Three.js 框架中的常量——Texture Constants 使用详解
- Three.js 框架中的常量——Core Constants 使用详解
- Three.js 框架中 `BufferAttribute` 的使用详解
- Three.js 框架中 `BufferGeometry` 的使用详解
- Three.js 框架中 `Clock` 的使用详解
- Three.js 框架中的 `EventDispatcher` 使用详解
- Three.js 框架中的 `GLBufferAttribute` 使用详解
- Three.js 框架中的 `InstancedBufferAttribute` 使用详解
- Three.js 框架中的 `InstancedBufferGeometry` 使用详解
- Three.js 框架中的 `InstancedInterleavedBuffer` 使用详解
- Three.js 框架中的 `InterleavedBufferAttribute` 使用详解
- Three.js 框架中的 `Layers` 使用详解
- Three.js 的 Object3D
- Three.js 的 Raycaster
- Three.js 框架中的 `Uniform` 使用详解
- Three.js 框架中 BufferAttribute Types 的使用详解
- 从入门到精通 Three.js 的 DataUtils
- 从入门到精通 Three.js 的 Earcut
- 深入了解 Three.js 中的 ImageUtils
- 深入了解 Three.js 中的 PMREMGenerator
- 深入了解 Three.js 中的 ShapeUtils
- 深入了解 Three.js 中的 Curve
- 深入了解 Three.js 中的 CurvePath
- 插值(Interpolations)
- 路径(Path)
- 形状(Shape)
- 形状路径(ShapePath)
- Three.js 框架中的弧线(ArcCurve)使用详解
- 深入解析 Three.js 中的 CatmullRomCurve3 使用
- 深入解析 Three.js 中的二维三次贝塞尔曲线(CubicBezierCurve)使用
- 深入解析 Three.js 中的三维三次贝塞尔曲线(CubicBezierCurve3)使用
- 深入解析 Three.js 中的椭圆曲线(EllipseCurve)使用
- 深入解析 Three.js 中的二维线段曲线(LineCurve)
- 深入解析 Three.js 框架中三维线段曲线(LineCurve3)的使用
- 深入解析 Three.js 框架中二维二次贝塞尔曲线(QuadraticBezierCurve)的使用
- 深入理解与应用 Three.js 的三维二次贝塞尔曲线(QuadraticBezierCurve3)
- Three.js 框架中的样条曲线(SplineCurve)的使用
- Three.js 框架中的立方缓冲几何体(BoxGeometry)使用
- Three.js 中的CapsuleGeometry使用
- Three.js 中的 CircleGeometry 使用详解
- 深入了解 Three.js 框架中的 ConeGeometry 使用
- 深入了解 Three.js 框架中的 CylinderGeometry 使用
- 深入理解 Three.js 中的 DodecahedronGeometry 使用
使用 Three.js 进行矩阵变换(Matrix Transformations)
class Matrix Transformations在 3D 图形中,矩阵变换是对对象进行位置、旋转和缩放等操作的基础。Three.js 提供了丰富的 API 来实现这些变换,本文将详细介绍矩阵变换的基本概念、常用方法,以及如何在 Three.js 中应用这些变换。
1. 矩阵变换的基本概念
矩阵变换是通过 4x4 矩阵对 3D 对象进行变换的方式。常见的变换类型包括:
- 平移(Translation):移动对象的位置。
- 旋转(Rotation):围绕某个轴旋转对象。
- 缩放(Scaling):改变对象的大小。
这些变换可以组合使用,以实现更复杂的效果。
2. 准备工作
确保在 HTML 文件中引入 Three.js:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Three.js 矩阵变换示例</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<style>
body { margin: 0; }
canvas { display: block; }
</style>
</head>
<body>
3. 创建基本的 Three.js 场景
3.1 初始化场景、摄像机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
3.2 添加简单的 3D 对象
我们将在场景中添加一个立方体和一个球体,以便演示矩阵变换:
const geometryCube = new THREE.BoxGeometry(1, 1, 1);
const materialCube = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const cube = new THREE.Mesh(geometryCube, materialCube);
scene.add(cube);
const geometrySphere = new THREE.SphereGeometry(0.5, 32, 32);
const materialSphere = new THREE.MeshBasicMaterial({ color: 0x0000ff });
const sphere = new THREE.Mesh(geometrySphere, materialSphere);
sphere.position.x = 3; // 初始位置
scene.add(sphere);
3.3 设置摄像机位置
设置摄像机的位置,以便能够看到场景中的对象:
camera.position.z = 5;
4. 矩阵变换操作
4.1 平移变换(Translation)
平移可以通过 position
属性直接设置:
cube.position.set(1, 1, 1); // 将立方体移动到 (1, 1, 1)
还可以通过 translateX
、translateY
和 translateZ
方法进行相对平移:
cube.translateX(2); // 向右平移 2 个单位
4.2 旋转变换(Rotation)
旋转可以通过 rotation
属性设置,单位为弧度:
cube.rotation.x = Math.PI / 4; // 绕 X 轴旋转 45 度
cube.rotation.y = Math.PI / 4; // 绕 Y 轴旋转 45 度
也可以使用 rotateX
、rotateY
和 rotateZ
方法进行相对旋转:
cube.rotateY(Math.PI / 2); // 绕 Y 轴顺时针旋转 90 度
4.3 缩放变换(Scaling)
缩放可以通过 scale
属性设置:
cube.scale.set(1.5, 1.5, 1.5); // 将立方体缩放到 1.5 倍
也可以使用 scale
方法进行相对缩放(不过不常用):
cube.scale.x *= 2; // 将立方体的 X 轴缩放加倍
5. 矩阵变换示例
5.1 组合变换
将平移、旋转和缩放结合起来,创建一个简单的动画:
function animate() {
requestAnimationFrame(animate);
// 旋转
cube.rotation.y += 0.01;
// 平移
cube.position.x += 0.01;
if (cube.position.x > 3) {
cube.position.x = -3; // 重置位置
}
// 渲染场景
renderer.render(scene, camera);
}
animate();
6. 使用矩阵手动进行变换
有时,我们可能需要直接操作矩阵。Three.js 提供了 Matrix4
类来处理这种情况。
6.1 创建和应用矩阵
创建一个变换矩阵:
const matrix = new THREE.Matrix4();
matrix.makeTranslation(1, 2, 0); // 创建平移矩阵
cube.applyMatrix4(matrix); // 应用矩阵
6.2 组合矩阵
可以组合多个矩阵以实现复合变换:
const translationMatrix = new THREE.Matrix4().makeTranslation(1, 0, 0);
const rotationMatrix = new THREE.Matrix4().makeRotationY(Math.PI / 2);
const scalingMatrix = new THREE.Matrix4().makeScale(1.5, 1.5, 1.5);
// 组合变换
const combinedMatrix = new THREE.Matrix4()
.multiplyMatrices(translationMatrix, rotationMatrix)
.multiply(scalingMatrix);
cube.applyMatrix4(combinedMatrix); // 应用复合变换
7. 完整示例代码
以下是一个完整的示例,展示了如何在 Three.js 中使用矩阵变换:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Three.js 矩阵变换示例</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<style>
body { margin: 0; }
canvas { display: block; }
</style>
</head>
<body>
<script>
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const geometryCube = new THREE.BoxGeometry(1, 1, 1);
const materialCube = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const cube = new THREE.Mesh(geometryCube, materialCube);
scene.add(cube);
const geometrySphere = new THREE.SphereGeometry(0.5, 32, 32);
const materialSphere = new THREE.MeshBasicMaterial({ color: 0x0000ff });
const sphere = new THREE.Mesh(geometrySphere, materialSphere);
sphere.position.x = 3;
scene.add(sphere);
camera.position.z = 5;
function animate() {
requestAnimationFrame(animate);
cube.rotation.y += 0.01; // 旋转
cube.position.x += 0.01; // 平移
if (cube.position.x > 3) {
cube.position.x = -3; // 重置位置
}
renderer.render(scene, camera);
}
// 使用矩阵进行平移
const matrix = new THREE.Matrix4();
matrix.makeTranslation(1, 2, 0);
cube.applyMatrix4(matrix);
animate();
</script>
</body>
</html>
8. 处理窗口调整
确保在窗口调整大小时更新渲染器和摄像机:
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
9. 结论
在本文中,我们详细探讨了如何在 Three.js 中使用矩阵变换,包括平移、旋转和缩放的实现,以及如何通过矩阵直接操作对象的变换。掌握这些基本概念和技巧,对于创建复杂的 3D 应用至关重要。希望这篇博客能够帮助你更好地理解和应用 Three.js 的矩阵变换!如有任何问题或建议,欢迎在评论区留言讨论!
评论区
评论列表
{{ item.user.nickname || item.user.username }}