[GAMES101]图形学入门笔记

线性代数基础知识

此处只补充部份线代内容,包括点乘、叉乘和正交。

向量点乘 Vector Dot Product

介绍点乘的基本概念,公式,以及应用。

两个向量点乘是一个标量,又是我们也会称其为两个向量的余弦相似度

公式:ab=||a||||b||cosθ​​

同时也可以获得两个向量的余弦角:cosθ=ab||a||||b||

如果是单位向量的话,模长为1,于是有:cosθ=ab

笛卡尔坐标系下的点乘为逐点相乘后相加:

In 2d Cartesian Coordinates:

ab=(xaya)(xbyb)=xaxb+yayb

In 3d Cartesian Coordinates:

ab=(xayaza)(xbybzb)=xaxb+yayb+zazb

用点乘获得向量投影

  • b表示向量b在向量向量a上的投影
  • b方向一定和a的单位向量a^同向或反向:b=ka^
  • k具体值如下:

k=||b||=||b||cosθ

点乘在图形学里的一些应用

  1. 测量两个向量的方向差

    用点乘公式获得余弦角。

  2. 分解向量:

    利用投影将向量b分解到向量a的方向上,获得b,然后让b减去该投影向量b获得剩余向量bb,获得了b的两组正交向量bbb

  3. 判断两个向量是否是前向/反向:

    点乘的结果是正数,根据公式可知余弦角小于90度,表示两个向量都是前向的;相反如果结果是负数,说明余弦角大于90度,两个向量是反向的。

向量叉乘 Vector Cross Product

两个向量叉乘是一个向量,该向量正交于叉乘的两个向量,方向遵循右手定则,因此叉乘的顺序会改变方向。

叉乘向量的模长公式:||a×b||=||a||||b||sinϕ

因此显然有:a×b=b×a, a×a=0

向量叉乘常常用于构建右手坐标系。

笛卡尔坐标系下的叉乘公式:

a×b=(yazbybzazaxbxazbxaybyaxb)=Ab=(0zayaza0xayaxa0)(xbybzb)

叉乘在图形学里的一些应用

  1. 判断向量b在向量a的左侧还是右侧:

    利用叉乘向量方向遵循右手定则来实现

  2. 判断一个点P是否在三角形ABC​的内部:

    按照顺时针或逆时针的顺序,分别叉乘:AP×AB,BP×BC,CP×CA。如果这几个结果的正负号一致,即点永远在向量的一侧,则该点一定在三角形内部。(可以推广到凸多边形。

正交坐标系 Orthonormal Coordinate Frames

坐标系很重要,有了坐标系就可以表示一些空间中的点和向量了。

往往会存在许多坐标系:Global / Local / Model / parts of model (head, hands, ...)。

需要掌握在不同坐标系下进行相互变换transform。

3D空间中任意三个单位正交向量,满足:

||u||+||v||+||w||=1uv=vw=wu=0w=u×vright-handed

都可以作为一组正交坐标系。

任意向量p都可以被一组正交坐标系唯一表示:

p=(pu)u+(pv)v+(pw)w

其中pu表示向量p在单位向量u上的投影。

坐标变换

2D坐标变换

我们可以用一个2x2的矩阵对一个2D向量进行变换:

(a11a12a21a22)(xy)=(a11x+a12ya21x+a22y)

上述这种,输入一个2D向量,通过一个简单的矩阵乘法后,输出另一个2D向量的做法称为线性变换。一般来说,我们会考虑沿着x轴或y轴完成一些操作。

Scaling 拉伸

常用的一种变换就是沿着一个坐标系进行拉伸scaling:

scale(sx,sy)(xy)=(sx00sy)(xy)=(sxxsyy)

Shearing 切变

切变变换类似于你把一副卡牌推开的样子,最下面保持不动,越靠近顶部移动的越多。

shear-x(s)=(1s01),shear-y(s)=(10s1)

Rotation 旋转

定义绕着原点逆时针旋转ϕ的变换如下:

rotate(ϕ)(xy)=(cosϕsinϕsinϕcosϕ)(xy)=(xcosϕysinϕxsinϕ+ycosϕ)

简单推导:假设原始向量(xa,ya)和x轴正方向的夹角为α,令向量的模长为r=xa2+ya2,于是有:

{xa=rcosαya=rsinα

则对于逆时针旋转ϕ后的向量(xb,yb),有:

{xb=rcos(α+ϕ)=rcosαcosϕrsinαsinϕ=xacosϕyasinϕyb=rsin(α+ϕ)=rsinαcosϕ+rcosαsinϕ=xasinϕ+yacosϕ

得证。

Relection 反射

沿着x轴或y轴镜像反射:

reflect-y(s)=(1001),reflect-x(s)=(1001)

齐次坐标系

齐次坐标系是用来解决translation不能写进矩阵变换的问题的,如放射变换:

(xy)=(abcd)(xy)+(txty)

我们不想让translation操作变成一种特例,想要和前面的linear transform保持一致,于是有了齐次坐标系的概念:

{2D point=(x,y,1)2D vector=(x,y,0)

这里可以简单理解为,点移动是会改变坐标的,但是向量移动后,还是会以原点为起点保持不变。

这也与如下规定保持了一致:

+==+=+=

在齐次坐标系中,(xyw)=(x/wy/w1) 表示的是同一个点。(w0)

于是translation matrix就有了:

(xy1)=(10tx01ty001)(xy1)=(x+txy+ty1)

Affine Tansformation 放射变换

Affine transformation = linear map + translation

(xy)=(abcd)(xy)+(txty)

用了齐次坐标系以后,我们就可以写成:

(xyw)=(abtxcdty001)(xy1)

同理有scaling,rotation等,不一一写了。

分解一些复杂的变换

可以简单拆分成三步:

  1. 把要旋转的点translate到坐标原点
  2. rotate
  3. translate回去

3D坐标变换

同样使用齐次坐标系:

{3D point=(x,y,z,1)3D vector=(x,y,z,0)

Affine Transformation:

(xyz1)=(abctxdeftyghitz0001)(xyz1)

posted @   colopen  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示