视图变换矩阵和投影变换矩阵

变换

3D -> 2D

2D空间的变换

  1. 缩放变换

[xy]=[s00s][xy]

  1. 反射变换--以坐标轴翻转

[xy]=[1001][xy]

  1. 剪切变换
    假设沿着x轴正向剪切,在y高度上,每个等高线上的点沿着x轴正向移动的距离是a*y,a为y=1时x的移动距离

[xy]=[1a01][xy]

  1. 旋转变换
    默认绕原点逆时针旋转α

[xy]=[cosαsinαsinαcosα][xy]

使用齐次坐标表示变换矩阵#

方便解决平移矩阵
2D变换矩阵 -> 3D变换矩阵

[abcd]>[abtxcdty001]

tx,ty就表示平移的移动量
同样对于2D平面内的点或者向量,也需要变为3D坐标表示,对于点可以在末尾加1即可,对于向量可以在末尾加0即可。
点:(x,y) -> (x,y,1)
向量:(x,y) -> (x,y,0)

3D空间变换

与2D平面相同,从3D->4D
点:(x,y,z) -> (x,y,z,1)
向量: (x,y,z) -> (x,y,z,0)

[abcdefghi]>[abctxdeftyghitz0001]

欧拉角#

处理3D空间中绕任意轴的旋转问题,将该轴求解出与坐标轴的角度关系
Rxyz(α,β,γ)=Rx(α)+Ry(β)+Rz(γ)

MVP矩阵

  1. Model Trans Matrix -> 对物体实际位置的变换
  2. View Trans Matrix -> 对相机的变换
  3. Proj Trans Matrix -> 3D->2D

Viewing Trans

View Trans 视图变换#

对相机位置和朝向的确定。
需要三个向量

  1. 相机位置 e
  2. 朝向 lookat g
  3. 向上方向 up direction l

物体如果和相机保持相对静止,那么相机的所看到的物体是一样的。
所以约定
1. 相机位置在原点,相机的朝向是-z,相机的向上方向是y

所以视图变换就是将相机位置(x,y,z)移动到(0,0,0),并旋转朝向向量和向上向量
g 旋转到 -z l 旋转到y (g×l)旋转到x
考虑从x轴,y轴,z轴旋转到g×llg的矩阵。
而反过来旋转就是该矩阵的逆,也即是视图变换矩阵的旋转模块。而由于旋转矩阵是正交矩阵,所以逆就是矩阵的转置。
然后对于空间中的物体,也需要应用该矩阵实现物体的变换。

Proj Trans 投影变换#

近大远小 或者 近远相同

正交变换#

近远相同,对于处在约定位置的相机观测出来的图像,将物体的z值去掉,即得到投影结果。
定义空间中一个立方体[l,r]×[b,t]×[f,n],这个立方体是观测物体的包围和。然后将这个包围盒变换为中心为原点的单位立方体,可以通过平移和缩放矩阵
l,r表示在x轴上的左边界和右边界,b,t表示在y轴上的底和顶,f,n表示在z轴上的前面和后面(由于摄像机是朝z负方向的)

Mortho=[2rl00002tb00002nf00001][100r+l2010t+b2001n+f20001]

透视变换#

近大远小

第一种方法#

GAMES101
压缩除了n平面的所有平面,将其他平面压缩,直到整个锥体变为长方体Mpersp>ortho
所以压缩后,x,y两值就变换为下式

x=nxzy=nyz

此时可以初步写出Mpersp>ortho除了第三行的矩阵

[n0000n00????0010]

由于压缩变换不会改变z的值。那么对于变换后的值[nxznyzz1]==[nxnyz2z]
可以推断出第三行格式为(0,0,A,B)
将z分别使用近平面值n和远平面值f带入即可求得两个参数

(0,0,A,B)[xyn1]==An+B==n2(0,0,A,B)[xyf1]==Af+B==f2

求解即得到A ,B值。

A=n+fB=nf

然后现在锥体就变为了长方体,再使用正交投影的矩阵相乘,即得到透视投影的变换矩阵
Mpersp=Mpersp>orthoMortho

第二种方法#

tinyrender
image

作者:XTG111

出处:https://www.cnblogs.com/XTG111/p/18052251

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   XTG111  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示