【图形学笔记】Lecture04-Transforms 变换

Lecture04-Transforms 变换

Transforms 变换

变换有什么用?1、建模。2、观察。

  • Scale Transform(non-uniform anisotropic)缩放变换(非规范,各向异性),如果是规范的就叫 相似变换(Similarity Transform)。
  • Reflection Transform 反射变换。
  • Shear Transform 剪切变换。
  • Rotate (CCW by default)旋转(默认逆时针)
  • Translation 平移:需要加一个维度(齐次坐标 Homogeneous Coordinates
    • 在齐次坐标上,(x,y,w) 在2D里面对应点 (x/w,y/w,1)(w0)
  • Affine Transformation 仿射变换

[xy1]=[abtxcdty001][xy1]

对应着先做线性变换(这里其实还有个概念叫刚体变换 Rigid Transform),再做平移

  • Projective Transform 对应着任意一个矩阵

Composite Transform 分解变换

有点显然,跳了。

Q:如何沿着给定的点 c 旋转?

A:先把c平移到原点,旋转,再平移回去,M=T(c)R(α)T(c)

3D Transformations 三维的变换

[xyz1]=[abctxdeftyghitz0001][xyz1]

几乎一样的,先线性变换,再平移。

旋转

绕着 x,y,z 轴旋转,意味着这个轴的基不动,旋转另外两个基,假设原本是exi=cosx+isinx=(X,Y),逆时针旋转 α 之后,得到e(x+α)i=cos(x+α)+isin(x+α)=XcosαYsinα+i(Ycosα+Xsinα),也就是e(x+α)i=(XcosαYsinα,Xsinα+Ycosα)

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

然后Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)欧拉角(注意这里是有顺序的,当然实际上关于欧拉角能说的也有很多细节,这里似乎都省略了)

Rodrigues 罗德里格旋转公式

沿着向量 n 旋转 α,对应的转移矩阵:

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

注记:

  • 1、注意这里的轴是默认过原点的,没过原点自然就要平移啦。
  • 2、右边的矩阵是个什么鬼东西?仔细想,这个向量对应着叉积运算:

[0nznynz0nxnynx0][xyz]=[ynz+znyxnzznxxny+znx]=((nx,ny,nz)×(x,y,z))T

Viewing Transformation 视图变换

  • 相机和物体一起移动,那么得到的照片是一样的。

  • 考虑把照相机移动到原点,并且朝着 z 轴的方向看,然后把物体做对应的变换。相机有哪些关键的信息?

  • 需要固定观测的方向 g,以及向上的方向(相机的向上方向) t,同时通常会定一个向 g×t

也就是说假设给相机做了变换 Mview,意味着:

  • 1、移动到原点。
  • 2、旋转 g (gaze direction)到 z 轴,旋转 ty 轴,旋转 g×tx 轴。

第一步是

Tview=[100xe010ye001ze0001]

第二步看起来不好求,考虑逆变换矩阵(这里相当于直接对列向量写):

Rview1=[xg×txtxg0yg×tytyg0zg×tztzg00001]

然后注意到一个事实:对于任意 n 维空间上的旋转变换,对应着把原本的基变成一组新的基,假设Rij=(x1,,xn),则

(RRT)ij=k=1nxikxjk=xixj

xi(i=1,,n) 都是单位向量,因此(RRT)ij 当且仅当 i=j 时为1,其他时候是 0,故 RRT=E,所以对于旋转变换,逆变换矩阵=变换矩阵的转置!

Rview=[xg×tyg×tzg×t0xtytzt0xgygzg00001]

最后

Mview=RviewTview

Projection Transformation投影变换

orthographic/perspective projection 正交/透视投影

Orthographic Projection正交投影

通过平移把立方体 [l,r]×[b,t]×[f,n] 中心移到原点,再通过伸缩变换把立方体变成标准(canonical)立方体[1,1]3

Mortho=[2rl00002tb00002nf00001][100(r+l)/2010(t+b)/2001(n+f)/20001]

这时候 z[1,1] ,在做 Z-buffer的时候比较方便。

注意: 现在的变换看来,会觉得沿着 z 轴的远/近不是很直观(n应该代表near,f应该代表far,但这里是反过来的)

Perspective Project 透视投影

三维空间怎么做透视投影?

  • 1、先挤压(squish),把锥台体(frustum)变成一个立方体(cuboid)。
  • 2、再做正交投影

标准的透视投影(只看头尾)

如果只看前后平面,透视投影之后 z 应该是不变的

  • 中心在 (0,0,0),想想投影平面z=d
  • (x,y,z)(xdz,ydz,d)
  • 如何用矩阵表示变换?齐次坐标! 所有形如(kx,ky,kz,k) 的齐次坐标(k0),都对应着3维空间里的点 (x,y,z)
  • 所以就变成考虑:

[xdzydzd1][xyzzd]=[100001000010001d0][xyz1]

Perspective to Orthographic

我们现在希望透视到正交的这一步,能保持一些性质:

  • 1、近平面和远平面的 z 应该保持不变。

  • 2、近平面和远平面的中心(假设平面中心穿过 z 轴)的坐标应该保持不变。

  • 3、 x,y 变换和上面的一样,(x,y)(xnz,ynz),其中 n 表示到近平面的距离。

于是:

[xyz1][x(n/z)y(n/z)?1]=mult. by z[nxnyz?z]

假设最左边到最右边乘了个我们要的矩阵 Mpersportho,那么应该有:

Mpersportho=[n0000n00????0010]

接着考察远近平面的中心不变这条性质,取近平面上任意一点 ,要有 Mpersportho(x,y,n,1)T=(nx,ny,n2,1)T,因为 x,y 是任取的,所以可以直接假设矩阵的第三行形如 (0,0,A,B) 的形式,那么有 An+B=n2

再考虑远平面的中心(0,0,f,1),变换后是(0,0,f,1)(0,0,f2,f),因此有 Af+B=f2,解方程组得到

{An+B=n2Af+B=f2  {A=n+fB=nf

最终

Mpersportho=[n0000n0000n+fnf0010]

以及

Mpersp=Mortho×Mpersportho

Q:那么在近平面和远平面中间的点的变化是均匀的吗?

A:并不是,比如取 (0,0,n+f2,1) 这一点,变换后 z 方向分量变为 n2+f22,很明显不是均匀的。

Hierarchical Transforms 层次变换

每个形状都有自己的变换,如果单独编辑一个元素,可以引起很多变换。

引入“骨骼”(Skeleton)的概念,分组表示:

  • 每个组包含一些更小的组,或者形状
  • 每个组的变换和上一级的组的变换相关
  • 每个组的变换自然就是,从根节点下来的变换的复合。
posted @   yoshinow2001  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示