[GAMES101]图形学入门笔记
线性代数基础知识
此处只补充部份线代内容,包括点乘、叉乘和正交。
向量点乘 Vector Dot Product
介绍点乘的基本概念,公式,以及应用。
两个向量点乘是一个标量,又是我们也会称其为两个向量的余弦相似度
公式:
同时也可以获得两个向量的余弦角:
如果是单位向量的话,模长为1,于是有:
笛卡尔坐标系下的点乘为逐点相乘后相加:
In 2d Cartesian Coordinates:
In 3d Cartesian Coordinates:
用点乘获得向量投影:
表示向量 在向量向量 上的投影 方向一定和 的单位向量 同向或反向: 具体值如下:
点乘在图形学里的一些应用:
-
测量两个向量的方向差
用点乘公式获得余弦角。
-
分解向量:
利用投影将向量
分解到向量 的方向上,获得 ,然后让 减去该投影向量 获得剩余向量 ,获得了 的两组正交向量 和 。 -
判断两个向量是否是前向/反向:
点乘的结果是正数,根据公式可知余弦角小于90度,表示两个向量都是前向的;相反如果结果是负数,说明余弦角大于90度,两个向量是反向的。
向量叉乘 Vector Cross Product
两个向量叉乘是一个向量,该向量正交于叉乘的两个向量,方向遵循右手定则,因此叉乘的顺序会改变方向。
叉乘向量的模长公式:
因此显然有:
向量叉乘常常用于构建右手坐标系。
笛卡尔坐标系下的叉乘公式:
叉乘在图形学里的一些应用:
-
判断向量
在向量 的左侧还是右侧:利用叉乘向量方向遵循右手定则来实现
-
判断一个点
是否在三角形 的内部:按照顺时针或逆时针的顺序,分别叉乘:
。如果这几个结果的正负号一致,即点永远在向量的一侧,则该点一定在三角形内部。(可以推广到凸多边形。
正交坐标系 Orthonormal Coordinate Frames
坐标系很重要,有了坐标系就可以表示一些空间中的点和向量了。
往往会存在许多坐标系:Global / Local / Model / parts of model (head, hands, ...)。
需要掌握在不同坐标系下进行相互变换transform。
3D空间中任意三个单位正交向量,满足:
都可以作为一组正交坐标系。
任意向量
其中
坐标变换
2D坐标变换
我们可以用一个2x2的矩阵对一个2D向量进行变换:
上述这种,输入一个2D向量,通过一个简单的矩阵乘法后,输出另一个2D向量的做法称为线性变换。一般来说,我们会考虑沿着x轴或y轴完成一些操作。
Scaling 拉伸
常用的一种变换就是沿着一个坐标系进行拉伸scaling:
Shearing 切变
切变变换类似于你把一副卡牌推开的样子,最下面保持不动,越靠近顶部移动的越多。
Rotation 旋转
定义绕着原点逆时针旋转
简单推导:假设原始向量
则对于逆时针旋转
得证。
Relection 反射
沿着x轴或y轴镜像反射:
齐次坐标系
齐次坐标系是用来解决translation不能写进矩阵变换的问题的,如放射变换:
我们不想让translation操作变成一种特例,想要和前面的linear transform保持一致,于是有了齐次坐标系的概念:
这里可以简单理解为,点移动是会改变坐标的,但是向量移动后,还是会以原点为起点保持不变。
这也与如下规定保持了一致:
在齐次坐标系中,
于是translation matrix就有了:
Affine Tansformation 放射变换
Affine transformation = linear map + translation
用了齐次坐标系以后,我们就可以写成:
同理有scaling,rotation等,不一一写了。
分解一些复杂的变换
可以简单拆分成三步:
- 把要旋转的点translate到坐标原点
- rotate
- translate回去
3D坐标变换
同样使用齐次坐标系:
Affine Transformation:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具