压轴出场的变换

Why study transformation

为什么我们要学习变换呢?

先认识两种不同的变换:Modeling(模型变换)、Viewing(视图变换)

描述摄像机位置的移动是变换的一个重大应用(平滑曲线移动),会跳舞的机器人

bc00e51628094de4af938977bb27e254.png

a4e6ca2cc54349babf1794021e81d130.png

动画: 

cc1c0909b6ae4e58b4addabe91154656.png

经典的开场 :变换可表示缩放动画

b18ade7432b943b6b379969916d765df.png

光栅化成像也大量涉及到变换,三维空间拍照片会变成二维图片(投影也是一种很重要的变换)

2D Transformations:Rotation,Scale,Shear

Scale 

4df6d2dcc0e146628060064753377058.png

 图像的缩放是一种很常见的变换,将原图缩小到原来的eq?%5Cfrac%7B1%7D%7B2%7D

aaa66fa3c0c64b5ebb97422a89646cca.png

可以将其写成矩阵形式:一个(缩放矩阵)对角阵:

b578978094e941f9ab81bdc3a3589116.png

那假如缩放的比例不一样呢?

 8784df5f35f943beafb698ec8c682265.jpeg

不一样也没关系,只要让Sx和Sy不相同就可以了 

Reflection Matrix

f90e760feb784064a9c6e9c6b8c1caa0.jpeg

镜像反转坐标嘞

 Shear Matrix

b45389c0d42c4b94a74b106bec6f43f4.png

切变就是拿到一张图,这张图有弹性,可以拽着上面那条边向右拉,拉歪后形成右面的结果

水平方向坐标发生变化,竖直方向坐标并没有变 

任何x水平方向的移动都是a×y:

 

4bb3cad338444ef884277c19445b3b27.png

Rotate

旋转变换:

edb146a89ca34f688b3d720f8f5c88a5.png

二维平面内绕着原点逆时针旋转45°  ,最重要的是找到一一对应的关系 

8498fc6eb4684b4e92944d2165a7b1f9.png

这个公式是整体性的,也就是说特殊点也符合该公式(1,0): 

f7d711509b1c4acb96cdb164dffb23d9.png

将这个矩阵展开:

16bb7d13ddc84f2ab905529beaea0f25.png

用这个特殊点(1,0)将A和C的值得到了,可以再用一个特殊点(0,1)将B和D的值算出来,最终结果:

547c044794aa4053b5b0abdacd2bd689.jpeg

共性:

f0b6daa39ed1424798b8b1f46a422313.png

这种形式我们称之为线性变换 (要用相同维度的矩阵×向量)

Homogeneous coordinates

 齐次坐标是一个需要注意的点,为什么要引入齐次坐标这样一个概念呢?

有一种很特殊的变换是平移变换:

3135b0ca99ab4e128986b25ccc865210.png

这一看就是很简单的一个变换呀:

 554feafbef4b437b9534679e334fc53d.png

这确实很简单,但存在一个问题,能不能把它写成矩阵形式,我们只能把它写成这样的形式:

0d821680e4e14bb8b4c5f1d8d0a826bc.png

平移操作不属于线性变换的范畴嘞,但是我们由于懒,不想把这个当做一个特殊情况去考虑,那有没有办法让所有变换都用一种简单的形式表达出来呢?

人们在长期探索中发现我们可以引入一种形式来表示坐标:将二维增加一个维度,对于点和向量写成这样的形式:

c1cfda6b9138475a8144f14ba529a3a2.png

 好处就是可以写成这样的形式:

262a1f6ec08a47d4b13a5a4fc7c414ba.png

引入齐次坐标之后,通过增加一个数将平移变换也写成矩阵×向量的形式

那为什么要把点和向量区别对待呢?

有个概念:向量方向不变(平移不变性),将向量的新增维度置零保持向量的不变性

6a056c31e3164c9988d3d41719984525.png

 点+点定义被扩充:

描述二维的点,表示两个点的中点(2-->1):

5426dfb13ce141b694f40900c18ff188.jpeg

Affine Transformations 

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

7c78a2e7609b498cb6fa81467e7afde6.png

用一个矩阵就可统一所有的操作:

1a0eab856efb40b79d90f4605c0a1020.jpeg

代价就是引入了额外的数字 

Inverse Transform

逆变换是将操作(撤销:Ctrl+U)返回来:

01a14332d8c6488fbc07d38ba6353d50.jpeg

Composing Transforms

组合变换是什么意思捏?还是举个例子:

dfce9175941b46a5bc9c105ae1830512.png

这样的变换是怎么得到的呢?

 我们可能可以这样做:

881740bc1d164dee9b597034f05614dc.png

平移后旋转发现和目标并不一致 

那怎样做能达到效果呢?这样就可以啦:

62ec6864db0e4398a1bad5bc12c1314a.png

明确两个点:

复杂的变换可以由简单的变换得到,变换的顺序十分重要 

057864e3d3f34397a9cbd1d4d27f9b4f.png

矩阵不满足交换律 ,向量默认是列向量,×矩阵,矩阵放在向量的左边,上面展示的是从右到左依次应用矩阵

这个概念是可以推广的:

6b26329c17414690b839f3ebaffbf248.png

从A1到An依次应用,用矩阵写就是上面的形式

 矩阵没有交换律但有结合律,那对它有什么作用呢?

可以表示非常复杂的变换

Decomposing Complex Transforms

e7bf65c22085497ab955bae80caf1e94.jpeg

变换不仅可以合成,还可以分解

旋转有缺省方式(以原点为中心逆时针旋转45°),那不想绕着原点为中心旋转该怎么办呢?

按照以上步骤:平移 -> 旋转 -> 平移,这是分解(从右到左)

3D Transformations

三维变换要复杂些,也会涉及到平移,老样子:

8eeca1e324f149da98571663ab9e3045.png

 齐次坐标矩阵×点:

f2d75ad1ea1749ceac3d438095d5fb32.png

 先线性变化,再平移

c70a42fcc28c45d38b3af98c9abd1970.png

旋转角度,顺时针旋转和逆时针旋转,相当于转置

从定义上看这是互逆操作:旋转矩阵的逆等于旋转矩阵的转置

Scale

缩放,和二维空间差不多:

35c336307683439dbbddbc33224a8e4e.png

Translation

平移,也不再赘述:

c1b7afa027344f80be8b58871d655cc8.png

 Rotate

三维变换中最复杂的可能就是旋转了:

05a2c7020c9042a3b06afeb47f676ca7.jpeg

上面是绕着某个坐标轴旋转,绕着y轴旋转有点问题:

根据右图可以看出,z叉乘x能得到y,而不是x叉乘z,这就是为什么是反的原因

复杂的问题可以转化成简单问题的组合:

9344a6d28bac413eb0bba6eb88f34e37.jpeg

 给我们简单的旋转来描述复杂的旋转,在图形学中发明了个可以描述任意旋转的式子:

666e72cf8ce94650aaf433086901020d.png

定义旋转轴(平移 -> 旋转 -> 平移),旋转角度 ,N(向量叉乘的对应矩阵)

Viewing transformation

View/Camera transformation

什么是视图变换呢?

f0f3fcc3f1d14893a1fc840a2441ccfe.png

摆pose-->找角度-->“茄子!”

在图形学中也进行着类似的变换,摆放相机:

69559c444a66404b954031a6993ee945.png

下一步是如何进行视图变换,当相机和所有物体一起移动的时候,得出的结果可能是一样的,那我们不妨把相机固定,让相机的位置永远不变,都是物体在移动,把相机放在原点处,沿着-z看 :

6217159c5e224188bdb833825432235d.jpeg

从任意位置调整到标准位置该怎么做呢?

792b61c692b4490f9690cb053ffe54d8.png

移中心 --> 旋转到-z ...

写成矩阵形式:

c083f8cdfd4744b6960165868cb2e7bc.png

 任意-->标准不好搞,但是标准-->任意较简单

 对旋转矩阵求逆,逆就是它的转置,这就是视图变换

相机物体应用同样的变换,相机落到相应的位置上,物体也就落在了相应的位置上

97e64516e50d46c1829b5e85d684cf74.png

Projection transformation

投影,投影分为正交投影和透视投影:

2911c05000b042d78217f54898124cfb.png

人眼成像更接近于右面的透视投影(平行线不再平行,相交到某一个地方)

 正交投影更多应用于工程制图,正交投影没有近大远小

93a3d492c2db44ebadeea683e6291afc.png

Orthograhic projection

正交,正交投影比较简单易学,不论远近,挤到一个平面就可以了,这样摆放:

067ee6ee759641b091d62833894b587c.png

好处是把Z扔掉自然就是一个平面了,但这样的操作不是很方便,在图形学中还有一种方式:

a403a3416878455e99b4cab23c2fdb97.png

采取平移后缩放的方式,将变换写成矩阵的形式用数学变换来做:

41d145b7ab2a41f0903c64a4d2576e36.png

Perspective projection

透视

 e4ff32665668452dbcb26a6002de03a4.png

透视投影是图形学中应用比较广泛的投影,近大远小(平行线永不香蕉,但近大远小)

 a6d695ddc9a3448299be7b8d27ff9128.png

看我的蕉币: 

71208778808a4300a9a6129bb15c369e.png

为什么这么多冰香蕉?

在透视投影中,一个投影相当于投影到另外的平面上,这种情况下将不代表平行线

740212f7adff44bc844ed0098d1e84ce.png

×z也是×,定义远近两个平面:

 3f2e543e0ec0430f8d6f294568fa901e.png

透视投影=挤压+正交投影 

那么我们怎么挤压呢?

b7b95ebaef4b4e70a47753d58ae02538.png

根据相似三角形求比值,已经告诉我们很多信息了,上下挤压可以被映射到右边的向量:

810c4b58dda74279a00b2ca6e040a34d.png

 

 根据已有关系推导矩阵:

f7c8c2bd6e5d44ffba0a2a767ac883d0.png

剩余的一行怎么办捏?

 任何一点近的平面没关系,远一点的平面也没关系

5400807c95cd4dc5806a206c31cc053e.png

 特殊点被映射成自己:

4e7d80f3fcd9457aa90dd9a57296419a.png

所以根据特殊点可以推断出第三行的前两个值(0,0)

在远平面上依旧如此,我们取远平面的中心点,挤压后仍然是最初的美好

c332033db8cd4693991c4304b3992c70.png

 

把这两个式子放到一块:

c0f1226796124281b1a06ea17f221bba.png

后面就是正交投影变换啦!是不是还挺简单的

 变换就到这告一段落啦!拜拜~

 

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值