3D 坐标系的基础概念、变换操作

3D 坐标系的学习文档可以帮助你理解在三维空间中如何定位、操作和理解对象。以下是一个详细的学习文档,涵盖了 3D 坐标系的基础概念、变换操作,以及它们在 3D 渲染中的应用。


3D 坐标系学习

1. 3D 坐标系简介

1.1 什么是 3D 坐标系?

3D 坐标系是用来描述三维空间中点或对象位置的系统。通常,我们使用笛卡尔坐标系来表示三维空间,其中包括三个相互垂直的轴:

  • X 轴:通常表示左右方向(水平)。
  • Y 轴:通常表示上下方向(垂直)。
  • Z 轴:通常表示前后方向(深度)。

在一个 3D 坐标系中,每个点的位置由一个三元组 (x, y, z) 来表示,分别表示该点在 X、Y 和 Z 轴上的位置。

1.2 世界坐标系 vs 局部坐标系

  • 世界坐标系:是一个全局参考坐标系,通常是固定不变的,所有对象的位置和方向都是相对于这个坐标系定义的。
  • 局部坐标系:是相对于某个对象自身的坐标系,用于描述对象的内部结构或在自身坐标系中的位置和旋转。

2. 3D 变换

在 3D 坐标系中,对象的移动、旋转和缩放是通过变换操作来实现的。变换操作主要包括平移(Translation)、旋转(Rotation)和缩放(Scale)。

2.1 平移 (Translation)

平移是将对象沿 X、Y、Z 轴移动一段距离。平移变换通过将对象的每个顶点坐标加上一个位移向量 (dx, dy, dz) 来实现。

  • 平移矩阵
    请添加图片描述

2.2 旋转 (Rotation)

旋转是围绕 X、Y 或 Z 轴旋转对象。旋转变换可以通过旋转矩阵实现,不同轴的旋转矩阵如下:

  • 绕 X 轴旋转
    请添加图片描述

  • 绕 Y 轴旋转
    请添加图片描述

  • 绕 Z 轴旋转
    请添加图片描述

2.3 缩放 (Scale)

缩放是改变对象的大小,可以分别沿 X、Y、Z 轴独立缩放。缩放矩阵如下:

  • 缩放矩阵
    请添加图片描述

2.4 组合变换

多个变换可以通过矩阵乘法组合在一起。例如,如果你想首先缩放对象,然后旋转它,最后平移它,你可以将各个变换矩阵依次相乘,应用于对象的顶点。

  • 组合矩阵
    M = T x R x S

这里 M 是最终的变换矩阵,T 是平移矩阵,R 是旋转矩阵,S 是缩放矩阵。应用顺序非常重要,因为矩阵乘法是不交换的。

3. 3D 投影

为了在二维屏幕上显示三维对象,我们需要将 3D 场景投影到 2D 平面上。常见的投影方式有两种:正交投影和透视投影。

3.1 正交投影 (Orthographic Projection)

正交投影保持对象的尺寸比例不变,无论它们离摄像机多远。这种投影适用于技术绘图和某些游戏场景。

  • 正交投影矩阵
    请添加图片描述

3.2 透视投影 (Perspective Projection)

透视投影模拟了人眼的视角,物体离得越远,看起来越小。这种投影使得 3D 场景看起来更加真实。

  • 透视投影矩阵
    请添加图片描述

3.3 视图矩阵 (View Matrix)

视图矩阵用于将世界坐标系转换为摄像机坐标系。这种转换相当于将场景从摄像机的位置和方向进行调整,使得摄像机成为观察点。

  • 视图矩阵通常是通过摄像机的位置(eye)、目标位置(center)和上向量(up)来定义的。

4. 实践应用

在 Three.js 中,理解 3D 坐标系和变换是至关重要的。以下是一些应用示例:

4.1 创建一个立方体

在 Three.js 中,我们可以通过定义几何体和应用变换来创建和操纵 3D 对象。以下是一个简单的例子,创建并旋转一个立方体:

import * as THREE from 'https://cdn.skypack.dev/three@0.155.0';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

camera.position.z = 5;

function animate() {
  requestAnimationFrame(animate);

  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;

  renderer.render(scene, camera);
}

animate();

4.2 使用变换矩阵

在高级应用中,你可以直接操作对象的变换矩阵来实现复杂的操作。例如,组合旋转和平移:

cube.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 4));
cube.applyMatrix4(new THREE.Matrix4().makeTranslation(1, 0, 0));

这些操作允许你精确地控制对象在 3D 空间中的行为和位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值