4 计算机图形学基础之坐标系统与表示
在上一篇中,我们简要介绍了计算机图形学的基本概念。在本篇中,我们将重点讨论计算机图形学中的坐标系统和数据表示。这些内容为后续的基本图形绘制打下了坚实的基础。
坐标系统
在计算机图形学中,坐标系统是我们描述和操作对象位置的基础。主要的坐标系统有:
1. 世界坐标系统
世界坐标系统
是我们在三维空间中定义物体位置的绝对坐标系,通常用 (X, Y, Z)
来表示。
2. 视图坐标系统
视图坐标系统
是由观察者的位置和视角定义的坐标系统。它是由世界坐标系经过一些变换(如平移、旋转)后得到的。视图坐标中的 (0, 0, 0)
通常表示观察者的位置。
3. 设备坐标系统
设备坐标系统
是指图形显示设备内使用的坐标系统。例如,在一个屏幕上,左上角通常被定义为 (0, 0)
,右下角则为 (width, height)
。这个坐标系不仅影响图形的呈现,还会影响绘制算法的实现。
4. 屏幕坐标系统
屏幕坐标系统更进一步,是一个二维坐标系统,通常忽略了 Z
坐标。它使用 (x, y)
来表示位置,并且原点一般位于屏幕的左上角。
坐标转换
在图形应用中,我们需要进行坐标系统之间的转换。例如,从世界坐标系转换到视图坐标系,或是从视图坐标系转换到设备坐标系。这些转换通常通过矩阵运算来实现。
坐标变换矩阵
坐标变换涉及到旋转、平移和缩放,这些可以通过矩阵表示:
-
平移矩阵
T
: -
旋转矩阵
R
(绕 z 轴): -
缩放矩阵
S
:
通过将上述矩阵相乘,我们可以生成一个复合变换矩阵,将物体的坐标从一个坐标系转换到另一个坐标系。
示例:坐标转换
假设我们有一个在世界坐标系中表示的点 ,我们希望将其转换到视图坐标系。
import numpy as np
# 定义平移矩阵
def translation_matrix(tx, ty, tz):
return np.array([[1, 0, 0, tx],
[0, 1, 0, ty],
[0, 0, 1, tz],
[0, 0, 0, 1]])
# 定义旋转矩阵
def rotation_matrix(theta):
cos_theta = np.cos(theta)
sin_theta = np.sin(theta)
return np.array([[cos_theta, -sin_theta, 0, 0],
[sin_theta, cos_theta, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
# 假设平移量为 (1, 2, 3) 并旋转 45 度
tx, ty, tz = 1, 2, 3
theta = np.pi / 4 # 45 degrees
# 组合变换
T = translation_matrix(tx, ty, tz)
R = rotation_matrix(theta)
transform_matrix = np.dot(T, R)
# 定义一个点 P_w
P_w = np.array([x, y, z, 1]) # 齐次坐标
# 进行坐标转换
P_v = np.dot(transform_matrix, P_w)
print("视图坐标系中的坐标:", P_v[:3]) # 取前三个元素
数据表示
在计算机图形学中,数据的表示方式直接影响到图形处理的效率和效果。主要有以下几种表示方式:
1. 点的表示
一个点在三维空间中的表示通常为一个三维向量 ,有时为了更方便地执行变换,使用齐次坐标表示为 。
2. 线的表示
线可以通过其两个端点的坐标来表示。假设有两个点 A(x_1, y_1, z_1)
和 B(x_2, y_2, z_2)
,则线段 AB
可以表示为一系列点或通过方程来表示。
3. 多边形的表示
多边形(如三角形)通常由多个顶点表示。三角形可以被定义为三个顶点的集合 ,在绘制时可以使用 顶点缓冲区
来提高效率。
4. 网格的表示
网格是一组相互连接的多边形,常用在 3D 模型中。网格通常使用顶点列表和索引列表来进行表示。
结语
本文详细介绍了计算机图形学中的坐标系统和数据表示。理解这些基础知识至关重要,因为它们为接下来的图形绘制原理提供了必要的理论基础。在下一篇中,我们将继续探索基本图形绘制的原理