当前位置: 首页 > news >正文

第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)

六、课后练习

  1. 实现向量类的反射向量计算方法
  2. 推导绕Y轴旋转的变换矩阵
  3. 编写代码实现点在复合变换下的坐标计算
  4. 思考:为什么变换矩阵的乘法顺序很重要?

七、参考资料

  • 《3D数学基础:图形与游戏开发》
  • 《计算机图形学》(Foley版)
  • OpenGL官方文档
  • GLSL着色语言规范
http://www.dtcms.com/a/306169.html

相关文章:

  • spring学习笔记一
  • 如何理解时间复杂度
  • 【世纪龙科技】比亚迪电动汽车技术仿真教学软件-助力人才培养
  • idea 集成飞算Java AI 教程
  • Mac下的Homebrew
  • 《Sentinel服务保护实战:控制台部署与SpringCloud集成指南》
  • Docker-01.Docker课程介绍
  • 【异世界历险之数据结构世界(冒泡、选择、快速排序)】
  • OpenCV图像缩放:resize
  • 【c++】leetcode763 划分字母区间
  • Ganttable 时间仪表盘
  • java~单例设计模式
  • 小架构step系列30:多个校验注解
  • 「Linux命令基础」压缩文件
  • ica1靶机攻略
  • iOS电池寿命与App能耗监测实战 构建完整性能监控系统
  • MSVC编译KDChart过程
  • IFCVF驱动+vhost-vfio提高虚拟机网络性能
  • BWCTAKC11X64G佰维/BIWIN存储容量为64GB
  • Java内存模型(JMM)
  • 制作一款打飞机游戏84:游戏视觉优化
  • 创建型设计模式-单例模式
  • Django模型关系:从一对多到多对多全解析
  • JSON.parse解析大整数踩坑
  • 9.项目起步(3)
  • ETCD学习之路
  • 代码随想录算法训练营第三十六天
  • 微软 Power Platform 使用Power Automate自动添加用户到AD域环境并分配环境角色
  • 「源力觉醒 创作者计划」_文心大模型 4.5 开源 28 天:从车间轴承到山村课堂的 AI 突围
  • 硬件电路设计(基本元器件)