文章目录
解密向量、矩阵与坐标系的魔法,感受3D数学在科技与艺术中的无限魅力!
在计算机图形学、游戏开发、机器人学、虚拟现实等领域,3D数学是构建三维世界的基石。无论是旋转一个物体、计算光照效果,还是模拟物理运动,3D数学都是实现这些功能的核心工具。
一、3D数学的核心概念
1.1 向量(Vector)
向量是3D数学中最基本的概念之一。它表示空间中的一个点或方向,并包含位置和大小的信息。在三维空间中,向量通常表示为 ( x , y , z ) (x, y, z) (x,y,z)。
示例代码:向量的定义与运算
class Vector3:
def __init__(self, x=0.0, y=0.0, z=0.0):
self.x = x
self.y = y
self.z = z
def __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.z
def 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
)
// 创建两个向量
v1 = Vector3(1, 2, 3)
v2 = Vector3(4, 5, 6)
// 向量加法
sum_vector = v1 + v2 # (5, 7, 9)
// 点积
dot_product = v1.dot(v2) # 1*4 + 2*5 + 3*6 = 32
// 叉积
cross_product = v1.cross(v2) # (-3, 6, -3)
1.2 矩阵(Matrix)
矩阵是用于表示线性变换的工具,如旋转、缩放和平移。在3D空间中,4×4矩阵是最常用的表示形式。
示例代码:矩阵的定义与变换
class Matrix4:
def __init__(self):
self.data = [[0.0 for _ in range(4)] for _ in range(4)]
def identity(self):
self.data = [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
]
def rotate_x(self, angle):
cos_theta = math.cos(angle)
sin_theta = math.sin(angle)
self.data = [
[1, 0, 0, 0],
[0, cos_theta, -sin_theta, 0],
[0, sin_theta, cos_theta, 0],
[0, 0, 0, 1]
]
// 创建一个4x4单位矩阵
matrix = Matrix4()
matrix.identity()
// 绕X轴旋转90度
matrix.rotate_x(math.pi / 2)
1.3 坐标系(Coordinate System)
在3D空间中,坐标系用于描述物体的位置和方向。常见的坐标系包括全局坐标系(世界坐标系)、局部坐标系(物体坐标系)和摄像机坐标系。
示例代码:坐标变换
def transform_point(point, matrix):
x = point.x * matrix.data[0][0] + point.y * matrix.data[1][0] + point.z * matrix.data[2][0] + matrix.data[3][0]
y = point.x * matrix.data[0][1] + point.y * matrix.data[1][1] + point.z * matrix.data[2][1] + matrix.data[3][1]
z = point.x * matrix.data[0][2] + point.y * matrix.data[1][2] + point.z * matrix.data[2][2] + matrix.data[3][2]
w = point.x * matrix.data[0][3] + point.y * matrix.data[1][3] + point.z * matrix.data[2][3] + matrix.data[3][3]
return Vector3(x/w, y/w, z/w)
// 将一个点绕X轴旋转90度
point = Vector3(0, 1, 0)
transformed_point = transform_point(point, matrix)
print(f"Transformed Point: ({
transformed_point.x}, {
transformed_point.y}, {
transformed_point.z})")
二、3D数学的应用场景
2.1 三维建模与动画
在游戏开发中,3D数学用于构建角色模型、场景模型以及实现动画效果。通过矩阵变换,可以实现角色的旋转、缩放和平移。
示例代码:角色旋转动画
import pygame
import math
pygame.init()
screen = pygame.display.set_mode((800, 600))
def draw_cube(position, rotation):
# 定义立方体顶点
vertices = [
Vector3(-1, -1, -1),
Vector3(1, -1, -1),
Vector3(1, 1, -1),
Vector3(-1, 1, -1),
Vector3(-1, -1, 1),
Vector3(1, -1, 1),
Vector3(1, 1, 1),
Vector3(-1, 1, 1)
]
# 创建旋转矩阵
rotation_matrix = Matrix4()
rotation_matrix.rotate_x(rotation.x)
rotation_matrix.rotate_y(rotation.y)
rotation_matrix.rotate_z(rotation.z)
# 绘制立方体
for vertex in vertices:
transformed_vertex = transform_point(vertex + position, rotation_matrix)
pygame.draw.circle(screen, (255, 255, 255),
(int(transformed_vertex.x * 100 + 400),
int(transformed_vertex.y * 100 + 300)), 3)
running = True
position = Vector3(0, 0, -5)
rotation = Vector3(0, math.pi/4, 0)
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((0, 0, 0))
draw_cube(position, rotation)
pygame.display.flip()
pygame.quit()
2.2 光照与阴影
光照是3D图形学中不可或缺的一部分。通过向量运算和矩阵变换,可以实现逼真的光照效果。
示例代码:简单光照模型
def calculate_lighting(normal_vector, light_direction):
# 计算点积以获取光照强度
intensity = normal_vector.dot(light_direction.normalize())
return max(intensity, 0.0)
定义法线向量
normal = Vector3(0, 1, 0).normalize()
定义光源方向
light = Vector3(0.5, -1, 0).normalize()
计算光照强度
intensity = calculate_lighting(normal, light)
print(f"Light Intensity: {
intensity}")
2.3 物理模拟
在机器人学和物理引擎中,3D数学用于模拟物体的运动和碰撞。
示例代码:刚体运动模拟
class Rigidbody:
def __init__(self, position=Vector3(), velocity=Vector3(), mass=1.0):
self.position = position
self.velocity = velocity
self.mass = mass
def apply_force(self, force):
acceleration = force / self.mass
self.velocity += acceleration
def update(self, delta_time):
self.position += self.velocity * delta_time
// 创建一个刚体物体
rigidbody = Rigidbody(Vector3(0, 5, 0), Vector3(0, -9.81, 0), 1.0)
for _ in range(10):
rigidbody.update(0.1)
print(f"Position: ({
rigidbody.position.x}, {
rigidbody.position.y}, {
rigidbody.position.z})")
三、如何学习与实践3D数学
3.1 学习资源推荐
- 书籍:
-《3D Math Primer for Graphics and Game Development》
-《Essential Mathematics for Games and Interactive Applications》 - 在线课程:
- Coursera上的《Mathematics for Computer Graphics》
- Udemy上的《Complete Guide to Game Development》
- 工具:
- Unity Engine(支持C#编程)
- Unreal Engine(支持C++编程)
3.2 实践建议
- 从小项目开始:尝试实现一个简单的3D旋转或光照效果。
- 参与开源项目:通过GitHub上的开源项目学习他人的实现方式。
- 持续优化:通过不断改进代码的效率和可维护性,提升自己的编程能力。
四、未来展望
随着虚拟现实、增强现实和人工智能的快速发展,3D数学的应用场景将更加广泛。未来的趋势包括:
- 实时渲染:基于光线追踪的实时渲染技术将成为主流。
- 物理仿真:更复杂的物理模拟将应用于机器人学和自动驾驶领域。
- AI驱动的图形生成:结合深度学习生成高质量的3D模型和场景。
3D数学是构建虚拟世界的基石,它不仅为计算机图形学提供了理论基础,也为机器人学、物理仿真等领域提供了强大的工具。深入学习向量、矩阵和坐标系等核心概念,并结合实际项目进行实践,我们可以掌握这一核心技术,并在未来的创新中发挥重要作用。
《3D数学基础:图形和游戏开发(第2版)》
内容简介
《3D数学基础:图形和游戏开发(第2版)》详细阐述了在计算机图形学中与数学相关的基本解决方案,主要包括笛卡儿坐标系、矢量、多个坐标空间、矩阵简介、矩阵和线性变换、矩阵详解、极坐标系、三维旋转、几何图元、二维图形的数学主题、力学知识以及三维曲线等内容。此外,该书还提供了相应的示例,以帮助读者进一步理解相关方案的实现过程。
《3D数学基础:图形和游戏开发(第2版)》适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学教材和参考手册。
目 录
第1章 笛卡儿坐标系
1.1 一维数学
1.2 二维笛卡儿空间
1.2.1 示例:假设的Cartesia城市
1.2.2 任意二维坐标空间
1.2.3 使用笛卡儿坐标指定二维中的位置
1.3 三维笛卡儿空间
1.3.1 新增维度和轴
1.3.2 在三维中指定位置
1.3.3 左手与右手坐标空间
1.3.4 本书中使用的一些重要约定
1.4 一些零散的基础知识介绍
1.4.1 求和与求积的表示法
1.4.2 区间符号
1.4.3 角度、度数和弧度
1.4.4 三角函数
1.4.5 三角函数的恒等式
1.5 练习
第2章 矢量
2.1 向量和其他无聊东西的数学定义
2.2 矢量的几何定义
2.3 使用笛卡儿坐标指定矢量
2.3.1 作为位移序列的矢量
2.3.2 零矢量
2.4 矢量与点
2.4.1 相对位置
2.4.2 点与矢量之间的关系
2.4.3 一切都是相对的
2.5 负矢量
2.5.1 正式线性代数规则
2.5.2 几何解释
2.6 标量和矢量的乘法
2.6.1 正式线性代数规则
2.6.2 几何解释
2.7 矢量的加法和减法
2.7.1 正式线性代数规则
2.7.2 几何解释
2.7.3 从一点到另一点的位移矢量
2.8 矢量大小
2.8.1 正式线性代数规则
2.8.2 几何解释
2.9 单位矢量
2.9.1 正式线性代数规则
2.9.2 几何解释
2.10 距离公式
2.11 矢量点积
2.11.1 正式线性代数规则
2.11.2 几何解释
2.12 矢量叉积
2.12.1 正式线性代数规则
2.12.2 几何解释
2.13 线性代数恒等式
2.14 练习
第3章 多个坐标空间
3.1 为什么需要多个坐标空间?
3.2 一些有用的坐标空间
3.2.1 世界空间
3.2.2 对象空间
3.2.3 相机空间
3.2.4 直立空间
3.3 基矢量和坐标空间转换
3.3.1 双重视角
3.3.2 指定坐标空间
3.3.3 基矢量
3.4 嵌套坐标空间
3.5 针对直立空间的再解释
3.6 练习
第4章 矩阵简介
4.1 矩阵的数学定义
4.1.1 矩阵维度和表示法
4.1.2 方形矩阵
4.1.3 作为矩阵的矢量
4.1.4 矩阵转置
4.1.5 矩阵与标量相乘
4.1.6 两个矩阵相乘
4.1.7 矢量和矩阵相乘
4.1.8 行与列矢量
4.2 矩阵的几何解释
4.3 线性代数的宏大图景
4.4 练习
第5章 矩阵和线性变换
5.1 旋转
5.1.1 在二维中的旋转
5.1.2 围绕主轴的三维旋转
5.1.3 围绕任意轴的三维旋转
5.2 缩放
5.2.1 沿主轴缩放
5.2.2 任意方向的缩放
5.3 正交投影
5.3.1 投影到主轴或主平面上
5.3.2 投影到任意线或平面上
5.4 反射
5.5 错切
5.6 组合变换
5.7 变换的分类
5.7.1 线性变换
5.7.2 仿射变换
5.7.3 可逆变换
5.7.4 保持角度的变换
5.7.5 正交变换
5.7.6 刚体变换
5.7.7 变换类型总结
5.8 练习
第6章 矩阵详解
6.1 矩阵的行列式
6.1.1 关于2×2和3×3矩阵的行列式
6.1.2 子矩阵行列式和余子式
6.1.3 任意n×n矩阵的行列式
6.1.4 行列式的几何解释
6.2 逆矩阵
6.2.1 经典伴随矩阵
6.2.2 逆矩阵—正式线性代数规则
6.2.3 逆矩阵—几何解释
6.3 正交矩阵
6.3.1 正交矩阵—正式线性代数规则
6.3.2 正交矩阵—几何解释
6.3.3 矩阵的正交化
6.4 关于4×4齐次矩阵
6.4.1 关于四维齐次空间
6.4.2 关于4×4平移矩阵
6.4.3 一般仿射变换
6.5 关于4×4矩阵和透视投影
6.5.1 针孔相机
6.5.2 透视投影矩阵
6.6 练习
第7章 极坐标系
7.1 关于二维极坐标空间
7.1.1 使用二维极坐标定位点
7.1.2 别名
7.1.3 关于二维中笛卡儿坐标和极坐标之间的变换
7.2 为什么有人会使用极坐标?
7.3 关于三维极坐标空间
7.3.1 圆柱坐标
7.3.2 球面坐标
7.3.3 在三维虚拟世界中有用的一些极坐标约定
7.3.4 球面坐标的别名
7.3.5 球面坐标和笛卡儿坐标之间的转换
7.4 使用极坐标指定矢量
7.5 练习
第8章 三维旋转
8.1 “定向”含义探微
8.2 矩阵形式
8.2.1 矩阵的选择
8.2.2 方向余弦矩阵
8.2.3 矩阵形式的优点
8.2.4 矩阵形式的缺点
8.2.5 矩阵形式小结
8.3 欧拉角
8.3.1 欧拉角约定
8.3.2 其他欧拉角约定
8.3.3 欧拉角的优点
8.3.4 欧拉角的缺点
8.3.5 欧拉角小结
8.4 轴-角和指数映射表示方式
8.5 四元数
8.5.1 四元数表示法
8.5.2 这四个数字的意思
8.5.3 四元数变负
8.5.4 单位四元数
8.5.5 四元数的大小
8.5.6 四元数的共轭和逆
8.5.7 四元数乘法
8.5.8 四元数的“差”
8.5.9 四元数点积
8.5.10 四元数的对数、指数和标量乘法
8.5.11 四元数指数
8.5.12 四元数插值
8.5.13 四元数的优缺点
8.5.14 作为复数的四元数
8.5.15 四元数概要
8.6 方法比较
8.7 表示方式之间的转换
8.7.1 将欧拉角转换为矩阵
8.7.2 将矩阵转换为欧拉角
8.7.3 将四元数转换为矩阵
8.7.4 将矩阵转换为四元数
8.7.5 将欧拉角转换为四元数
8.7.6 将四元数转换为欧拉角
8.8 练习
第9章 几何图元
9.1 表示技术
9.2 直线和光线
9.2.1 光线
9.2.2 直线的特殊二维表示
9.2.3 表示方式之间的转换
9.3 球体和圆形
9.4 包围盒
9.4.1 关于AABB的表示方式
9.4.2 计算AABB
9.4.3 关于AABB与包围球
9.4.4 变换AABB
9.5 平面
9.5.1 平面方程:平面的隐式定义
9.5.2 使用3个点定义一个平面
9.5.3 超过3个点的“最佳拟合”平面
9.5.4 点到平面的距离
9.6 三角形
9.6.1 表示法
9.6.2 三角形的面积
9.6.3 重心空间
9.6.4 计算重心坐标
9.6.5 特殊点
9.7 多边形
9.7.1 简单多边形和复杂多边形
9.7.2 凸多边形和凹多边形
9.7.3 三角剖分和扇形分割
9.8 练习
第10章 三维图形的数学主题
10.1 图形工作原理
10.1.1 两种主要的渲染方法
10.1.2 描述表面特性:BRDF
10.1.3 颜色和辐射度测量简介
10.1.4 渲染方程
10.2 关于三维视图
10.2.1 指定输出窗口
10.2.2 像素宽高比
10.2.3 视锥体
10.2.4 视野和缩放
10.2.5 正交投影
10.3 坐标空间
10.3.1 模型、世界和相机空间
10.3.2 裁剪空间和裁剪矩阵
10.3.3 裁剪矩阵:准备投影
10.3.4 裁剪矩阵:应用缩放并准备裁剪
10.3.5 屏幕空间
10.3.6 坐标空间概述
10.4 多边形网格
10.4.1 索引三角网格
10.4.2 表面法线
10.5 纹理映射
10.6 标准局部照明模型
10.6.1 标准照明公式:概述
10.6.2 镜面反射分量
10.6.3 漫反射分量
10.6.4 环境光和发光分量
10.6.5 照明方程:综合考虑各分量
10.6.6 标准模型的局限性
10.6.7 平面着色和Gouraud着色
10.7 光源
10.7.1 标准抽象光类型
10.7.2 光衰减
10.7.3 关于Doom风格体积光
10.7.4 预先计算的照明
10.8 骷髅动画
10.9 凹凸映射
10.9.1 切线空间
10.9.2 计算切线空间基矢量
10.10 实时图形管道
10.10.1 缓冲区
10.10.2 传递几何体
10.10.3 顶点级别的操作
10.10.4 裁剪
10.10.5 背面剔除
10.10.6 光栅化、着色和输出
10.11 一些HLSL示例
10.11.1 贴花着色和HLSL基础知识
10.11.2 基础的每个像素Blinn-Phong照明
10.11.3 使用Gouraud着色算法
10.11.4 凹凸映射
10.11.5 蒙皮网格
10.12 深入阅读建议
10.13 练习
第11章 力学1:线性运动学和微积分
11.1 概述
11.1.1 忽略的东西
11.1.2 关于宇宙的一些有用的谎言
11.2 基本数量和单位
11.3 平均速度
11.4 瞬时速度和导数
11.4.1 极限参数和导数的定义
11.4.2 导数示例
11.4.3 通过定义计算导数
11.4.4 导数的表示法
11.4.5 一些求导法则和快捷方式
11.4.6 泰勒级数的一些特殊函数的导数
11.4.7 链式法则
11.5 加速度
11.6 恒定加速度下的运动
11.7 积分
11.7.1 积分的例子
11.7.2 导数与积分之间的关系
11.7.3 微积分小结
11.8 匀速圆周运动
11.8.1 平面内的匀速圆周运动
11.8.2 三维中的匀速圆周运动
11.9 练习
第12章 力学2:线性和旋转动力学
12.1 牛顿的3个基本定律
12.1.1 牛顿的前两个定律:力与质量
12.1.2 惯性参考系
12.1.3 牛顿第三定律
12.2 一些简单的力定律
12.2.1 重力
12.2.2 摩擦力
12.2.3 弹簧力
12.3 动量
12.3.1 动量守恒
12.3.2 质心
12.4 冲击力和碰撞
12.4.1 完全非弹性碰撞
12.4.2 一般碰撞响应
12.4.3 关于Dirac Delta
12.5 旋转动力学
12.5.1 旋转运动学
12.5.2 关于二维旋转动力学
12.5.3 关于三维旋转动力学
12.5.4 与旋转的碰撞响应
12.6 实时刚体模拟器
12.6.1 物理引擎状态变量
12.6.2 高级概述
12.6.3 欧拉积分
12.6.4 旋转的积分
12.7 深入阅读建议
12.8 练习
第13章 三维曲线
13.1 参数多项式曲线
13.1.1 参数曲线
13.1.2 多项式曲线
13.1.3 矩阵表示法
13.1.4 两种简单的曲线
13.1.5 单项式端点
13.1.6 速度和切线
13.2 多项式插值
13.2.1 艾特肯的算法
13.2.2 拉格朗日基多项式
13.2.3 多项式插值汇总
13.3 埃尔米特曲线
13.4 贝塞尔曲线
13.4.1 关于de Casteljau算法
13.4.2 伯恩斯坦基多项式
13.4.3 贝塞尔导数及其与埃尔米特形式的关系
13.5 细分
13.5.1 细分单项式曲线
13.5.2 细分贝塞尔曲线
13.6 样条曲线
13.6.1 游戏规则
13.6.2 节点
13.7 埃尔米特和贝塞尔样条曲线
13.8 连续性
13.8.1 参数连续性
13.8.2 几何连续性
13.8.3 曲线平滑度
13.9 自动切线控制
13.9.1 Catmull-Rom样条
13.9.2 TCB样条
13.9.3 端点条件
13.10 练习
第14章 后记
14.1 接下来做什么
14.2 练习
附录A 几何测试
A.1 在二维隐式直线上的最近点
A.2 参数化光线上的最近点
A.3 平面上的最近点
A.4 圆或球体上的最近点
A.5 轴向对齐的包围盒中的最近点
A.6 相交测试
A.7 在二维中两条隐式直线的交点
A.8 在三维中两条光线的交点
A.9 光线和平面的交点
A.10 轴向对齐的包围盒与平面的交点
A.11 个平面的交点
A.12 光线与圆或球体的交点
A.13 两个圆或球的交点
A.14 球体与轴向对齐的包围盒的交点
A.15 球体与平面的交点
A.16 光线与三角形的交点
A.17 两个AABB的交点
A.18 光线与AABB的交点
附录B 练习答案
B.1 第1章
B.2 第2章
B.3 第3章
B.4 第4章
B.5 第5章
B.6 第6章
B.7 第7章
B.8 第8章
B.9 第9章
B.10 第10章
B.11 第11章
B.12 第12章
B.13 第13章
参考文献