计算机图形学三维坐标系统全面解析

1,000 阅读6分钟

一、三维坐标系统基础认知

在计算机图形学的领域中,三维坐标系统是构建虚拟三维空间的重要基石,它借助三个相互垂直的坐标轴来精准定位空间里的每一个点。

(一)常见三维坐标系统分类

  1. 笛卡尔坐标系统
    • 该系统包含三个两两垂直的坐标轴,分别是 X 轴(代表水平方向)、Y 轴(代表垂直方向)和 Z 轴
    • 依据坐标轴方向的不同,又可细分为左手坐标系和右手坐标系。
      • 左手坐标系:伸出左手,让大拇指指向 X 轴正方向,食指指向 Y 轴正方向,那么中指所指方向就是 Z 轴正方向。
      • 右手坐标系:伸出右手,使大拇指指向 X 轴正方向,食指指向 Y 轴正方向,此时中指所指方向为 Z 轴正方向。
  1. 摄像机坐标系统
    • 此系统以虚拟摄像机的视角作为参考,其坐标轴定义如下:
      • X 轴:指向摄像机的右侧。
      • Y 轴:指向摄像机的上方。
      • Z 轴:指向摄像机的前方(也就是视线的方向)。
  1. 局部坐标系统与世界坐标系统
    • 局部坐标系统:每个物体都拥有自身独立的坐标系统,便于对物体进行局部变换操作。
    • 世界坐标系统:是整个场景所使用的全局坐标系统,用于确定所有物体在场景中的绝对位置。

二、三维坐标变换操作

在三维空间中,物体的位置、方向和大小等属性可以通过坐标变换来实现调整,主要的变换类型包括平移、旋转和缩放。

(一)平移变换

平移变换是指将物体沿着某个坐标轴方向进行移动。假设在三维空间中有一个点 ( (x, y, z) ),要将其沿着 X 轴平移 ( t_x ) 个单位,沿着 Y 轴平移 ( t_y ) 个单位,沿着 Z 轴平移 ( t_z ) 个单位,那么平移后的点坐标为 ( (x + t_x, y + t_y, z + t_z) )。

在 JavaScript 中,可以通过以下代码实现平移变换:

function translate(point, tx, ty, tz) {
    return {
        x: point.x + tx,
        y: point.y + ty,
        z: point.z + tz
    };
}
// 示例:将点(1, 2, 3)沿X轴平移2个单位,Y轴平移3个单位,Z轴平移4个单位
const point = { x: 1, y: 2, z: 3 };
const translatedPoint = translate(point, 2, 3, 4);
// 输出结果:{ x: 3, y: 5, z: 7 }

(二)旋转变换

旋转变换是围绕某个坐标轴对物体进行旋转操作,这里我们以绕 X 轴、Y 轴、Z 轴旋转为例进行说明。

  1. 绕 X 轴旋转

假设点 ( (x, y, z) ) 绕 X 轴旋转角度 ( \theta ),旋转后的点坐标计算方式如下:

新的 Y 坐标为 ( y \times \cos\theta - z \times \sin\theta )

新的 Z 坐标为 ( y \times \sin\theta + z \times \cos\theta )

X 坐标保持不变,即仍为 ( x )。

在 JavaScript 中实现绕 X 轴旋转的代码如下:

function rotateX(point, angle) {
    const cos = Math.cos(angle);
    const sin = Math.sin(angle);
    return {
        x: point.x,
        y: point.y * cos - point.z * sin,
        z: point.y * sin + point.z * cos
    };
}
// 示例:将点(0, 1, 0)绕X轴旋转90度(π/2弧度)
const point = { x: 0, y: 1, z: 0 };
const rotatedPoint = rotateX(point, Math.PI / 2);
// 输出结果:{ x: 0, y: 0, z: 1 }
  1. 绕 Y 轴旋转

当点 ( (x, y, z) ) 绕 Y 轴旋转角度 ( \theta ) 时,旋转后的点坐标为:

新的 X 坐标为 ( x \times \cos\theta + z \times \sin\theta )

新的 Z 坐标为 ( -x \times \sin\theta + z \times \cos\theta )

Y 坐标不变,为 ( y )。

JavaScript 实现代码如下:

function rotateY(point, angle) {
    const cos = Math.cos(angle);
    const sin = Math.sin(angle);
    return {
        x: point.x * cos + point.z * sin,
        y: point.y,
        z: -point.x * sin + point.z * cos
    };
}
// 示例:将点(1, 0, 0)绕Y轴旋转90度(π/2弧度)
const point = { x: 1, y: 0, z: 0 };
const rotatedPoint = rotateY(point, Math.PI / 2);
// 输出结果:{ x: 0, y: 0, z: 1 }
  1. 绕 Z 轴旋转

点 ( (x, y, z) ) 绕 Z 轴旋转角度 ( \theta ) 后,坐标变化为:

新的 X 坐标为 ( x \times \cos\theta - y \times \sin\theta )

新的 Y 坐标为 ( x \times \sin\theta + y \times \cos\theta )

Z 坐标不变,是 ( z )。

JavaScript 代码如下:

function rotateZ(point, angle) {
    const cos = Math.cos(angle);
    const sin = Math.sin(angle);
    return {
        x: point.x * cos - point.y * sin,
        y: point.x * sin + point.y * cos,
        z: point.z
    };
}
// 示例:将点(0, 1, 0)绕Z轴旋转90度(π/2弧度)
const point = { x: 0, y: 1, z: 0 };
const rotatedPoint = rotateZ(point, Math.PI / 2);
// 输出结果:{ x: -1, y: 0, z: 0 }

(三)缩放变换

缩放变换用于改变物体的大小。对于点 ( (x, y, z) ),分别沿着 X 轴、Y 轴、Z 轴进行缩放,缩放因子为 ( s_x )、( s_y )、( s_z ),缩放后的点坐标为 ( (x \times s_x, y \times s_y, z \times s_z) )。

JavaScript 实现代码如下:

function scale(point, sx, sy, sz) {
    return {
        x: point.x * sx,
        y: point.y * sy,
        z: point.z * sz
    };
}
// 示例:将点(2, 2, 2)在三个轴上都缩放2倍
const point = { x: 2, y: 2, z: 2 };
const scaledPoint = scale(point, 2, 2, 2);
// 输出结果:{ x: 4, y: 4, z: 4 }

三、三维坐标系统的实际应用场景

(一)三维建模领域

在三维建模软件中,如 Blender、Maya 等,设计师借助三维坐标系统来精确确定模型中每个顶点的位置,通过对顶点进行平移、旋转和缩放等操作,构建出复杂的三维模型。

(二)游戏开发领域

在游戏开发过程中,三维坐标系统用于确定游戏角色、场景物体以及摄像机的位置和方向。例如,通过对游戏角色进行平移变换使其在场景中移动,通过旋转变换改变角色的朝向,通过缩放变换实现角色的变大或变小等效果。

(三)虚拟现实(VR)和增强现实(AR)领域

在 VR 和 AR 应用中,三维坐标系统至关重要。它用于跟踪用户的头部和手部运动,并将这些运动转换为虚拟环境中的坐标变换,从而为用户带来沉浸式的体验。例如,当用户转动头部时,系统通过摄像机坐标系统的变换来更新虚拟场景的视角。

四、总结

三维坐标系统是计算机图形学的核心概念之一,平移、旋转和缩放等坐标变换操作是实现三维图形效果的基础。通过深入理解三维坐标系统及其变换原理,并结合 JavaScript 等编程语言进行实践,能够更好地在计算机图形学领域进行开发和创作。在实际应用中,需要根据具体的场景选择合适的坐标系统和变换方式,以实现预期的图形效果。

以上是关于计算机图形学三维坐标系统的教学内容。你对这篇文章的内容深度、案例选择等方面有什么看法或进一步需求,欢迎随时告诉我。