第2课:几何数学
阶段一:第2课:几何数学
一、课程目标
掌握图形学中常用的几何数学基础,包括向量、矩阵的运算及空间变换原理。
二、向量(Vector)
1. 向量的基本概念
- 定义:既有大小又有方向的量,区别于只有大小的标量。
- 表示方法:
- 几何表示:带箭头的线段
- 坐标表示:二维向量(x,y),三维向量(x,y,z)
2. 向量运算
(1)加法与减法
- 几何意义:遵循平行四边形法则或三角形法则
- 坐标运算:对应分量相加减
若向量A=(x₁,y₁,z₁),向量B=(x₂,y₂,z₂) 则A+B=(x₁+x₂,y₁+y₂,z₁+z₂)
(2)数乘
- 几何意义:缩放向量长度,方向可能反转
- 坐标运算:各分量乘以标量
若向量A=(x,y,z),标量k 则kA=(kx,ky,kz)
(3)点积(Dot Product)
- 定义:A·B = |A||B|cosθ
- 坐标运算:
A·B = x₁x₂ + y₁y₂ + z₁z₂
- 几何应用:
- 计算两向量夹角
- 判断方向关系(同向、垂直、反向)
- 投影计算
(4)叉积(Cross Product)
- 定义:A×B = |A||B|sinθ·n(n为垂直于A和B的单位向量)
- 坐标运算:
A×B = (y₁z₂-y₂z₁, z₁x₂-z₂x₁, x₁y₂-x₂y₁)
- 几何应用:
- 计算垂直于两向量的法向量
- 判断向量的左右/内外关系
- 计算平行四边形面积
3. 向量的归一化(Normalization)
- 定义:将向量缩放为单位长度(模长为1)
- 计算方法:
单位向量 Â = A/|A| 其中|A| = √(x²+y²+z²)
三、矩阵(Matrix)
1. 矩阵的基本概念
- 定义:由m行n列数排列成的矩形阵列
- 表示方法:[aᵢⱼ],其中i为行标,j为列标
2. 矩阵运算
(1)矩阵加法与减法
- 条件:同型矩阵(行数和列数相同)
- 运算规则:对应元素相加减
(2)矩阵乘法
- 条件:左矩阵列数等于右矩阵行数
- 运算规则:
若A为m×n矩阵,B为n×p矩阵,则C=AB为m×p矩阵 Cᵢⱼ = Σ(Aᵢₖ×Bₖⱼ) (k从1到n)
- 重要性质:
- 不满足交换律:AB≠BA
- 满足结合律:(AB)C=A(BC)
(3)矩阵与向量的乘法
- 几何意义:对向量进行变换(旋转、缩放、平移等)
- 运算规则:将向量视为列矩阵进行乘法
3. 特殊矩阵
(1)单位矩阵(Identity Matrix)
- 定义:主对角线元素为1,其余元素为0的方阵
- 性质:任何矩阵乘以单位矩阵等于本身
(2)转置矩阵(Transpose Matrix)
- 定义:将原矩阵的行和列互换得到的矩阵
- 表示:Aᵀ
(3)逆矩阵(Inverse Matrix)
- 定义:对于方阵A,若存在方阵B使得AB=BA=I,则B为A的逆矩阵,记为A⁻¹
- 性质:
- 只有行列式不为0的方阵才有逆矩阵
- (AB)⁻¹ = B⁻¹A⁻¹
四、空间变换
1. 变换的分类
- 线性变换:保持向量加法和数乘的变换(旋转、缩放)
- 仿射变换:线性变换+平移
- 投影变换:将三维空间投影到二维平面
2. 基本变换矩阵
(1)平移变换
[x'] [1 0 0 tx] [x]
[y'] = [0 1 0 ty] [y]
[z'] [0 0 1 tz] [z]
[1 ] [0 0 0 1 ] [1]
(2)旋转变换
- 绕Z轴旋转θ角:
[x'] [cosθ -sinθ 0 0] [x]
[y'] = [sinθ cosθ 0 0] [y]
[z'] [0 0 1 0] [z]
[1 ] [0 0 0 1] [1]
- 绕X轴、Y轴旋转的矩阵类似
(3)缩放变换
[x'] [sx 0 0 0] [x]
[y'] = [0 sy 0 0] [y]
[z'] [0 0 sz 0] [z]
[1 ] [0 0 0 1] [1]
3. 齐次坐标(Homogeneous Coordinates)
- 引入目的:用矩阵运算统一表示线性变换和平移变换
- 表示方法:将三维坐标(x,y,z)表示为四维坐标(x,y,z,w)
- 当w=1时,表示点
- 当w=0时,表示向量
4. 变换的组合
- 顺序问题:变换矩阵的乘法顺序不可交换
- 一般顺序:缩放→旋转→平移
五、实践案例
1. 向量运算实现
import mathclass Vector3:def __init__(self, x=0, y=0, z=0):self.x = xself.y = yself.z = zdef __add__(self, other):return Vector3(self.x+other.x, self.y+other.y, self.z+other.z)def __sub__(self, other):return Vector3(self.x-other.x, self.y-other.y, self.z-other.z)def dot(self, other):return self.x*other.x + self.y*other.y + self.z*other.zdef cross(self, other):return Vector3(self.y*other.z - self.z*other.y,self.z*other.x - self.x*other.z,self.x*other.y - self.y*other.x)def magnitude(self):return math.sqrt(self.x**2 + self.y**2 + self.z**2)def normalize(self):mag = self.magnitude()if mag != 0:return Vector3(self.x/mag, self.y/mag, self.z/mag)return Vector3()
2. 矩阵运算实现
class Matrix4x4:def __init__(self):# 初始化为单位矩阵self.data = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]def multiply(self, other):result = Matrix4x4()for i in range(4):for j in range(4):result.data[i][j] = sum(self.data[i][k] * other.data[k][j] for k in range(4))return result@staticmethoddef translation(tx, ty, tz):m = Matrix4x4()m.data[0][3] = txm.data[1][3] = tym.data[2][3] = tzreturn m@staticmethoddef rotation_z(angle):m = Matrix4x4()c = math.cos(angle)s = math.sin(angle)m.data[0][0] = cm.data[0][1] = -sm.data[1][0] = sm.data[1][1] = creturn mdef transform_point(self, point):x = self.data[0][0]*point.x + self.data[0][1]*point.y + self.data[0][2]*point.z + self.data[0][3]y = self.data[1][0]*point.x + self.data[1][1]*point.y + self.data[1][2]*point.z + self.data[1][3]z = self.data[2][0]*point.x + self.data[2][1]*point.y + self.data[2][2]*point.z + self.data[2][3]return Vector3(x, y, z)
六、课后练习
- 实现向量类的反射向量计算方法
- 推导绕Y轴旋转的变换矩阵
- 编写代码实现点在复合变换下的坐标计算
- 思考:为什么变换矩阵的乘法顺序很重要?
七、参考资料
- 《3D数学基础:图形与游戏开发》
- 《计算机图形学》(Foley版)
- OpenGL官方文档
- GLSL着色语言规范