[简化版 GAMES 101] 计算机图形学 03:线性代数下

[简化版 GAMES 101] 计算机图形学03:线性代数下

Bilibili同步视频

[简化版 GAMES 101] 计算机图形学 03:线性代数下

✨ 图形学的世界里,线性代数是当之无愧的底层基石,而向量叉乘与矩阵运算更是其中的核心工具。从三维坐标系的构建到图形内外部的判定,从简单的向量变换到复杂的相机运动模拟,这些基础运算始终贯穿其中。今天,我们就从图形学应用视角,拆解向量叉乘与矩阵运算的定义、性质及实战价值,为后续的图形学学习筑牢根基。✨

一、向量叉乘:突破平面的向量运算💫

提到向量运算,点积是大家的老熟人,但叉乘作为另一种乘法运算,与点积有着本质区别------点积的结果是标量,而叉乘的结果是全新的向量,这一特性也让它成为处理三维空间问题的关键。

1. 叉乘的核心定义

叉乘的输入是两个三维向量 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b ,输出的向量 c ⃗ = a ⃗ × b ⃗ \vec{c}=\vec{a}×\vec{b} c =a ×b 有着明确的几何特征: c ⃗ \vec{c} c 同时垂直于 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b ,也就意味着 c ⃗ \vec{c} c 垂直于 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 所在的整个平面,是跳出原平面的三维向量。

从大小来看, c ⃗ \vec{c} c 的模长为 ∣ a ⃗ ∣ × ∣ b ⃗ ∣ × s i n θ |\vec{a}|×|\vec{b}|×sinθ ∣a ∣×∣b ∣×sinθ ( θ θ θ 为 a ⃗ \vec{a} a 与 b ⃗ \vec{b} b 的夹角);而方向的判定,需要借助右手螺旋定则 :伸出右手,四指沿 a ⃗ \vec{a} a 旋转至 b ⃗ \vec{b} b 的方向,大拇指所指的方向,就是 c ⃗ \vec{c} c 的方向。

2. 叉乘的关键性质

叉乘的运算性质是其应用的基础,几个核心特性需要牢牢掌握:

  • 不满足交换律 : a ⃗ × b ⃗ = − ( b ⃗ × a ⃗ ) \vec{a}×\vec{b} = -(\vec{b}×\vec{a}) a ×b =−(b ×a ) ,交换两个向量的顺序,结果向量方向完全相反,仅需添加负号即可转换。

  • 自身叉乘为0向量 :任意向量与自身叉乘,因夹角 θ = 0 ° θ=0° θ=0° , s i n θ = 0 sinθ=0 sinθ=0 ,结果为长度为0的0向量(注意是向量,而非数字0)。

  • 满足分配律与结合律:与常规运算一致,叉乘的分配律和结合律均成立,为复杂运算的化简提供了可能。

3. 图形学中的核心应用🎯

叉乘并非单纯的数学概念,在图形学中有着极强的实战意义,两大核心应用更是贯穿图形学基础开发:

(1)构建三维右手坐标系

这是叉乘最基础的应用,在三维空间中,若给定x轴和y轴的单位向量,通过 x ⃗ × y ⃗ \vec{x}×\vec{y} x ×y 即可直接得到z轴的单位向量,以此构建的坐标系即为右手坐标系 (图形学教学中主流的坐标系形式)。同理, y ⃗ × z ⃗ = x ⃗ \vec{y}×\vec{z}=\vec{x} y ×z =x , z ⃗ × x ⃗ = y ⃗ \vec{z}×\vec{x}=\vec{y} z ×x =y ,只需掌握右手螺旋定则,即可快速推导。

小贴士:部分图形学API(如OpenGL)采用左手坐标系, x ⃗ × y ⃗ = − z ⃗ \vec{x}×\vec{y}=-\vec{z} x ×y =−z ,开发时需注意坐标系类型的区分。

(2)判定左右与内外部关系

这是叉乘在图形学中最常用的实战技巧,本质是利用叉乘结果的符号判断向量相对位置,核心适用于XY平面(z轴为叉乘结果方向):

  • 左右判定 :计算 a ⃗ × b ⃗ \vec{a}×\vec{b} a ×b ,若结果z分量为正,说明 b ⃗ \vec{b} b 在 a ⃗ \vec{a} a 的左侧;若z分量为负,说明 b ⃗ \vec{b} b 在 a ⃗ \vec{a} a 的右侧。

  • 内外部判定 :这是三角形光栅化、像素着色的基础!对于逆时针/顺时针排列的三角形ABC和待判定点P,分别计算 A B ⃗ × A P ⃗ \vec{AB}×\vec{AP} AB ×AP 、 B C ⃗ × B P ⃗ \vec{BC}×\vec{BP} BC ×BP 、 C A ⃗ × C P ⃗ \vec{CA}×\vec{CP} CA ×CP ,若三个结果的符号一致(均正或均负),则P在三角形内部;若存在符号不同的结果,则P在外部。

特殊情况:若叉乘结果为0,属于图形学中的corner case,可自行定义点在内部或外部,如光线擦过三角形边的相交判定,无统一标准。

二、矩阵运算:图形变换的通用工具🔧

如果说叉乘解决了三维空间的几何判定问题,那么矩阵运算就是图形学中实现所有变换的核心载体------平移、旋转、缩放、错切,所有图形的位置和形态变化,都可以通过矩阵运算来描述和实现。

1. 矩阵的基础认知

矩阵本质是按行和列排列的数值集合,用 m × n m×n m×n 表示其维度(m行n列)。矩阵的基础运算中,数乘(矩阵所有元素同乘一个数)较为简单,而矩阵乘法是核心,也是难点。

2. 矩阵乘法的核心规则

两个矩阵能进行乘法运算的前提 :第一个矩阵的列数 = 第二个矩阵的行数(如 3 × 2 3×2 3×2 矩阵可与 2 × 4 2×4 2×4 矩阵相乘,中间的2为匹配维度)。

相乘后的结果矩阵维度为第一个矩阵的行数 × 第二个矩阵的列数 (如 3 × 2 3×2 3×2 × 2 × 4 2×4 2×4 = 3 × 4 3×4 3×4 )。

而结果矩阵中任意元素的计算,可借助向量点积快速记忆:求结果矩阵第i行第j列的元素,只需取第一个矩阵的第i行、第二个矩阵的第j列,将两个行/列向量做点积即可。

3. 矩阵运算的核心性质

与叉乘类似,矩阵乘法的性质直接决定了运算的逻辑,核心记住这几点:

  • 不满足交换律 : A × B ≠ B × A A×B ≠ B×A A×B=B×A ,矩阵乘法的顺序直接决定结果,图形变换中顺序的改变会导致完全不同的变换效果。

  • 满足结合律与分配律 : ( A × B ) × C = A × ( B × C ) (A×B)×C = A×(B×C) (A×B)×C=A×(B×C) ,结合律的存在让复杂变换的矩阵可以提前合并,提升计算效率;分配律 A × ( B + C ) = A × B + A × C A×(B+C)=A×B+A×C A×(B+C)=A×B+A×C 同样成立。

4. 图形学中的特殊矩阵与操作

在图形学的矩阵应用中,几个特殊矩阵和核心操作是必须掌握的,它们是实现图形变换的基础:

(1)矩阵与向量相乘

图形学中,向量始终被视为列向量 ( m × 1 m×1 m×1 矩阵),矩阵与向量相乘需遵循"矩阵在左,向量在右",且矩阵的列数等于向量的行数。这一运算也是实现单个向量变换 的核心,比如用 [ − 1 0 0 1 ] \begin{bmatrix}-1&0\\0&1\end{bmatrix} [−1001] 乘以二维向量 [ x , y ] T [x, y]^T [x,y]T ,可实现向量沿y轴的镜像变换,结果为 [ − x , y ] T [-x, y]^T [−x,y]T 。

(2)矩阵转置

将矩阵的行和列互换,即为转置操作(记为 A T A^T AT ),如 3 × 2 3×2 3×2 矩阵转置后为 2 × 3 2×3 2×3 矩阵。核心性质: ( A × B ) T = B T × A T (A×B)^T = B^T × A^T (A×B)T=BT×AT ,乘积的转置需先调换矩阵顺序,再分别转置。

(3)单位矩阵

单位矩阵是对角线上元素均为1,其余为0的对角阵 (如3×3单位矩阵 I 3 = [ 1 0 0 0 1 0 0 0 1 ] I_3=\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix} I3= 100010001 ),其核心作用是"无操作": I × A = A I×A=A I×A=A , A × I = A A×I=A A×I=A ,是矩阵求逆的基础。

(4)矩阵的逆

若矩阵 A A A 与矩阵 B B B 相乘的结果为单位矩阵,即 A × B = B × A = I A×B=B×A=I A×B=B×A=I ,则 A A A 与 B B B 互逆(记为 B = A − 1 B=A^{-1} B=A−1 )。逆矩阵是实现逆变换 的关键,比如旋转后的图形可通过旋转矩阵的逆矩阵恢复原位置。核心性质: ( A × B ) − 1 = B − 1 × A − 1 (A×B)^{-1} = B^{-1} × A^{-1} (A×B)−1=B−1×A−1 ,与转置性质类似,乘积的逆需先调换顺序再分别求逆。

三、向量运算的矩阵形式:数与形的统一📐

线性代数的魅力在于其统一性,向量的点乘和叉乘,都可以转化为矩阵运算的形式,这一转换让向量运算可以融入矩阵的统一框架,为复杂的图形学算法推导提供了便利。

  1. 点乘的矩阵形式 :向量 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 的点积 a ⃗ ⋅ b ⃗ \vec{a}·\vec{b} a ⋅b ,可表示为 a ⃗ T × b ⃗ \vec{a}^T × \vec{b} a T×b ( a ⃗ T \vec{a}^T a T 为 a ⃗ \vec{a} a 的转置行向量),行向量乘列向量的结果为标量,与点积结果一致。

  2. 叉乘的矩阵形式 :向量 a ⃗ × b ⃗ \vec{a}×\vec{b} a ×b 可转化为对偶矩阵 (记为 A ∗ A^* A∗ )与 b ⃗ \vec{b} b 的相乘,即 A ∗ × b ⃗ A^* × \vec{b} A∗×b 。只需将向量 a ⃗ \vec{a} a 按特定规则转化为对偶矩阵,再与列向量 b ⃗ \vec{b} b 相乘,结果即为叉乘的向量,这一形式在旋转矩阵的推导中有着重要作用。

四、后续学习指引:从基础到进阶🚀

本次分享的向量叉乘与矩阵运算,是图形学所需线性代数的核心基础,也是相对易懂的部分。后续的图形学学习,将基于这些基础向更复杂的方向推进:

  1. 二维/三维图形变换:深入讲解平移、旋转、缩放、错切的矩阵表示,掌握复杂图形的组合变换技巧;

  2. 齐次坐标:图形学中实现平移变换的关键,是突破普通线性变换的重要工具;

  3. 相机运动模拟:结合矩阵变换与向量运算,实现相机的移动、旋转等三维运动,是3D图形学的核心应用之一。

同时,为了让大家更好地上手后续的实战作业,助教也将搭建作业0的框架,帮助大家完成从理论到实践的过渡,为作业1的实战做好准备。

写在最后📝

线性代数作为图形学的"内功",看似枯燥的公式和性质,实则是解锁所有图形学特效的钥匙。向量叉乘让我们能判定三维空间的几何关系,矩阵运算让我们能实现任意的图形变换,这些基础内容的掌握程度,直接决定了后续图形学学习的效率。

本次的内容只是图形学基础的起点,后续的学习虽会逐渐变难,但只要筑牢这些底层知识,理清运算的逻辑和应用场景,就能一步步解锁图形学的精彩世界。下一期,我们将深入图形变换的世界,从二维旋转开始,探索矩阵运算的实战魅力,敬请期待!

💬 互动区:你在学习向量叉乘和矩阵运算时,遇到过哪些难点?欢迎在评论区留言交流,一起攻克图形学基础难关!

相关推荐
Dxy12393102162 小时前
如何使用 ECharts 绘制 K 线图
开发语言·javascript
fe7tQnVan2 小时前
从玩具到生产:基于 ChromaDB 打造工程级 RAG 系统
开发语言·c#
一路向北he2 小时前
esp32库依赖
c语言·c++·算法
Frank_refuel2 小时前
QT->信号与槽详解下补充(概述、使用、自定义、连接方式、其他说明)
开发语言·qt
happymaker06262 小时前
VueCli标准化工程中的组件通信操作
开发语言·前端·javascript
ySq0REx012 小时前
.NET 10 & C# 14 New Features 新增功能介绍-.NET CLI工具改进
开发语言·c#·.net
Howrun7772 小时前
C++ 项目测试全指南:从 0 基础到落地实操
开发语言·c++·log4j
小灰灰搞电子2 小时前
Qt UI 线程详解-阻塞与解决方案
开发语言·qt·ui
YYYing.2 小时前
【Linux/C++网络篇(二) 】TCP并发服务器演进史:从多进程到Epoll的进化指南
linux·服务器·网络·c++·tcp/ip