2.Transformation线性变换

WHY

  • 我们通过摄像机对拍摄的画面进行缩放、旋转、偏移,来将三维模型映射到二维的屏幕画面上

二维线性变换

x,=a x+b yy,=c x+d y[x,y,]=[abcd][xy]x,=M x

  • 二维线性变换通用形式

1.缩放矩阵

[x,y,]=[S00S][xy]

  • 对于矩阵上任意点[xy]经过缩放矩阵后,结果为[SxSy],比较好理解
  • 当然,x轴和y轴方向的缩放不一定相同

2.反射矩阵

[x,y,]=[1001][xy]

  • 对于矩阵上任意点[xy]经过反射后,结果为[xy],相当于图像对于y轴进行了反转

3.切变矩阵

[x,y,]=[1a01][xy]

  • 切变,具体表现为像拉着图像的一角向一个方向倾斜
  • 观察可得当y=0时,图像在水平方向移动为0,当y=1时,图像在水平方向移动为a,且图像的y轴一直没有变化
  • 得出结论,对于矩阵上任意点[xy]经过切变后,结果为[x+ayy]

4.旋转矩阵

  • 前提:绕着原点(0,0)旋转,且默认逆时针旋转

Rθ=[cosθsinθsinθcosθ]

推导流程

  • 通过特殊点A(0,1)经过旋转θ角度,现在的坐标为(cosθ,sinθ),可得[cosθsinθ]=[A BC D][10],得到两个式子cosθ=A1+B0=A,sinθ=C1+D0=C
  • 通过特殊点B(0,1)经过旋转θ角度,现在的坐标为B(sinθ,cosθ),可得[sinθcosθ]=[A BC D][01],得到两个式子sinθ=A0+B1=B,cosθ=C0+D1=D
  • 得出A=cosθ,B=sinθ,C=sinθ,D=cosθ

齐次座标

WHY

为什么要学习齐次座标,因为平移变换不能直接写成矩阵形式

[x,y,]=[abcd][xy]+[txty]

  • 带入上面的通用式子后发现不能直接套用
  • 为了统一标准表现矩阵的变换,大佬们引入了齐次座标
  • 二维点=(x,y,1)T
  • 二维向量=(x,y,0)T
  • 二维点的平移矩阵如下

[x,y,w,]=[10tx01ty001][xy1]=[x+txy+ty1]

仿射变换

  • 统一二维线性变换和平移变换,引入了仿射变换
  • 仿射变换=线性变换+平移,类似结构如下

(x,y,)=(abcd)(xy)+(txty)

  • 所有仿射变换可以写成齐次坐标形式

(x,y,1)=(abtxcdty001)(xy1)

缩放矩阵(齐次坐标)

S(sx,sy)=(sx000sy0001)

旋转矩阵(齐次坐标)

R(α)=(cosαsinα0sinαcosα0001)

平移矩阵(齐次坐标)

T(tx,ty)=(10tx01ty001)

多种变换组合

要点

  • 组合变换的顺序不能调换
  • 运算的顺序为从右往左

例子:

图像先旋转45,再x轴平移1。

例题:这个矩阵如何变化到最终结果

  • 先平移到原点(0,0)
  • 旋转到相应角度
  • 平移相同距离返回到移动前的位置

三维线性变换

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

三维空间仿射变换

(x,y,z,1)=(abctxdeftyghitz0001)(xyz1)

缩放

S(sx,sy,sz)=(1000010000100001)

平移

T(tx,ty,tz)=(100tx010ty001tz0001)

旋转

-绕x轴旋转

Rx(α)=(10000cosαsinα00sinαcosα00001)

-绕y轴旋转

Ry(α)=(cosα0sinα00100sinα0cosα00001)

-绕z轴旋转

Rz(α)=(cosαsinα00sinαcosα0000100001)

  • 绕x轴旋转,绕z轴旋转和绕y轴旋转矩阵为什么不一致
  • 因为y轴是由z轴叉乘x轴获得的(根据右手螺旋定则,手指由z轴绕向x轴,大拇指方向为y轴方向)
  • x轴是由yXz得到,z轴是由xXy得到,y是相反的
罗德里格斯旋转公式:把任意旋转转化成矩阵形式

R(n,α)=cos(α)I+(1+cos(α))nnT+sin(α)(0nznynz0nxnynx0)N

推导流程

观测变换(Viewing Transformation)

  • 视图、摄像机变换
  • 投影变换
    • 正交变换
    • 透视变换

1.视图变换(View/Camera Transformation)

问题:怎么拍一张照片

  1. 选一个好地方,人摆好位置(model transformation)
  2. 选一个好的角度放置摄像机,包括摄像机的位置高度,朝向等(view transformation)
  3. 拍照,把三维空间投影到二维空间(projection transformation)

简称MVP变换

  • 通过三个变量来确定摄像机的唯一属性
  • Position e,摄像机在三维空间里的位置座标
  • Look-at/gaze direction g^,表示摄像机的朝向
  • up direction t^,摄像机自身向上的方向

  • 约定摄像机摆放在原点(0,0,0),自身朝向以y轴为向上,以-z轴方向为观测方向

问题:怎么让一个摄像机回到原点并恢复默认观察状态

  1. 移动摄像机回到原点(0,0,0)
  2. 旋转g^,使其朝向-z轴
  3. 旋转t^,使其朝向y轴

简单的描述为先平移后旋转

NEXT:怎么用矩阵来表示?
  • Mview=RviewTview
  • 平移的矩阵好写的,但是旋转g^和旋转t^的矩阵比较复杂
  • 但是从-Z、Y、X轴旋转到g^,t^向量的逆矩阵很好写

  • 得到逆矩阵
  • 由于旋转矩阵是正交矩阵,矩阵的转置=逆矩阵,转置后获得了旋转矩阵

总结

  • 拍摄的物体要和摄像机一起运动到相对位置上
  • 摄像机自身朝向为y轴,拍摄方向为-Z轴

2.投影变换(Projection transformation)

把三维空间投影到二维空间

a)正交投影(Orthographic projection)

  • 不管摄像机距离远近,一样的大小
  • 常用于UI界面
常规方式理解正交投影操作

  • 正交投影的操作类似于把一个已知长宽高的立方体,不同比例缩放到(1,1)3的标准1体积立方体中来
  • 首先,把立方体放置到原点(0,0,0)
  • 然后把长宽高缩放到(-1,1)

矩阵怎么表示?

Mortho=[2rl00002tb00002nf00001][100l+r2010t+b2001n+f20001]

b)透视投影(Perspective projection)

特点:

  • 近大远小
  • 齐次坐标中表示3维中的一个点(x,y,z,1),乘以k(k!=0),(kx,ky,kz,k),这个点还是原来的点(3维中)。
透视投影的转换关系表示

  • 关键思想:找到初始点(x,y,z)与转化后的点(x',y',z')的关系
  • 根据相似三角形y,=nzy,同理x,=nzx,z轴方向未知
  • 我们可以反推出变换矩阵的第一第二行和最后一行

接着来求第三行

  • 根据近平面投影切面的点P’(x',y',z')的z'始终为z',z’对于投影后的P’已经没有意义了,这个信息点已经没用了
  • 但对于3D图形管线来说,为了便于进行后面的片元操作,例如z缓冲消隐算法,有必要把投影之前的z保存下来,方便后面使用。
  • 因此,我们利用这个没用的信息点存储为n,设第3个数为n
  • x,y,1同乘以n,得到新的式子,已知矩阵的第三行与x,y无关,所以前两个位置为0,后两个位置设为A,B ,得到An+B1=n^2

矩阵表示:

  • 再根据远平面切面的中心点经过变换仍是中心点,得到

  • 联立后可得

  • 最终推导出透视投影的变换矩阵

Mpersp>ortho=(n0000n0000n+fnf0010)

posted @   oOLzYOo  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示