Games101学习笔记--变换(二)

本文详细介绍了三维空间中物体的变换,包括缩放、平移和旋转的矩阵表示,以及欧拉角和罗德里格斯公式的应用。同时,阐述了观测变换(摄像机变换)的概念,定义了摄像机的位置、注视方向和上方向。最后,讨论了投影变换,对比了正交投影和透视投影的特点,并给出了各自的变换矩阵计算方法。
摘要由CSDN通过智能技术生成

一、三维空间中物体的变换

0)补充说明

在接下来的矩阵运算中,我们使用的是齐次坐标进行运算。

1)缩放和平移

对于三维空间中的物体,我们进行缩放和平移使用的线性变换矩阵分别为以下两种
在这里插入图片描述
(其中矩阵S为缩放矩阵,矩阵T为平移矩阵)
那么,要缩放三维空间中的一个物体,我们需要用到的变换为
[ x 1 y 1 z 1 1 ] = [ s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x_1\\ y_1\\ z_1\\ 1\\ \end{bmatrix} = \begin{bmatrix} s_x&0&0&0\\ 0&s_y&0&0\\ 0&0&s_z&0\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix} x1y1z11 = sx0000sy0000sz00001 xyz1
相似地,平移物体时,我们使用的是以下的变换
[ x 1 y 1 z 1 1 ] = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x_1\\ y_1\\ z_1\\ 1\\ \end{bmatrix} = \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix} x1y1z11 = 100001000010txtytz1 xyz1

2)旋转

对于旋转,在三维空间中相比二维平面复杂一些,在三维空间中,旋转分为三种:

  1. 绕x轴旋转
  2. 绕y轴旋转
  3. 绕z轴旋转

三种旋转的变换矩阵从上往下依次为:
R x ( α ) = [ 1 0 0 0 0 c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 ] R_x(\alpha)= \begin{bmatrix} 1&0&0&0\\ 0&cos\alpha&-sin\alpha&0\\ 0&sin\alpha&cos\alpha&0\\ 0&0&0&1\\ \end{bmatrix} Rx(α)= 10000cosαsinα00sinαcosα00001
R y ( α ) = [ c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 0 0 0 1 ] R_y(\alpha)= \begin{bmatrix} cos\alpha&0&sin\alpha&0\\ 0&1&0&0\\ -sin\alpha&0&cos\alpha&0\\ 0&0&0&1\\ \end{bmatrix} Ry(α)= cosα0sinα00100sinα0cosα00001
R z ( α ) = [ c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 0 0 0 0 1 ] R_z(\alpha)= \begin{bmatrix} cos\alpha&-sin\alpha&0&0\\ sin\alpha&cos\alpha&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix} Rz(α)= cosαsinα00sinαcosα0000100001

3)欧拉角

当我们要对三维空间物体进行任意旋转时,我们就运用到了欧拉角,其表达方式如下:
R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) R_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)R_y(\beta)R_z(\gamma) Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)

4)罗德里格斯公式(Rodrigues’ Rotation Formula)

在三维向量进行旋转时,我们可以使用罗德里格斯公式,例如绕轴n旋转角度alpha的旋转计算如下所示:
在这里插入图片描述
由于证明过程过于复杂,这里暂时省略。

二、观测变换(view transformation)

为了实现观测,我们就需要有一个摄像机。因此观测变换也称为摄像机变换(camera transformation)

1)摄像机的定义

为了在三维空间中定义一个摄像机,需要用到以下几个量:

  • 摄像机位置(position)
  • 摄像机注视方向(gaze direction)
  • 与摄像机注视方向垂直的上方向(up direction)

三个量均使用向量来描述。

2)观测变换矩阵

观测变换就是将摄像机位置移到坐标原点,变换到以y轴正方向为up direction的方向,z轴负方向为gaze direction的方向。如果这里我们分别设摄像机的三个量依次为
p o s i t i o n = e ⃗ position=\vec{e} position=e
g a z e D i r e c t i o n = g ⃗ gaze Direction=\vec{g} gazeDirection=g
u p D i r e c t i o n = t ⃗ upDirection=\vec{t} upDirection=t
再设 u ⃗ = g ⃗ × t ⃗ \vec{u}=\vec{g}\times\vec{t} u =g ×t
那么我们在观测变换需要做的事情就有:

  • 将摄像机位置移动到坐标原点
  • 将向量g旋转到-z方向
  • 将向量t旋转到+y方向
  • 还需要注意将向量u旋转到+x方向

变换矩阵:
i)移动摄像机位置:
在这里插入图片描述
ii)旋转向量g、t和u:
在这里插入图片描述
iii)观测变换矩阵M:
M v i e w = R v i e w T v i e w M_{view}=R_{view}T_{view} Mview=RviewTview

三、投影变换(projection transformation)

在将三维场景显示到屏幕上时,我们需要使用到投影变换,而投影变换一般分为两种:正交投影和透视投影。

1)两种投影的区别

正交投影:投影的像只与物体本身的大小有关
透视投影:投影的像根据物体距离投影面的远近有关,呈现近大远小的效果。
示意图如下:
在这里插入图片描述

2)正交投影(Orthographic projection)

经过观测变换后,摄像机已经位于原点,朝向z轴负方向,对于正交投影,摄像机的可视范围是一个长方体,为了简化计算,我们将其变换为一个标准立方体,假设未变换的长方体坐标范围为 [ l , r ] × [ b , t ] × [ f , n ] [l,r]\times[b,t]\times[f,n] [l,r]×[b,t]×[f,n]
在这里插入图片描述
则要将其转换为标准立方体的范围 [ − 1 , 1 ] 3 [-1,1]^3 [1,1]3
要实现这一过程,我们的操作是先平移,再缩放。平移的变换矩阵为:
T o r t h o = [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] T_{ortho}=\begin{bmatrix} 1&0&0&-{r+l\over 2}\\ 0&1&0&-{t+b\over 2}\\ 0&0&1&-{n+f\over 2}\\ 0&0&0&1\\ \end{bmatrix} Tortho= 1000010000102r+l2t+b2n+f1
缩放的变换矩阵为:
S o r t h o = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] S_{ortho}=\begin{bmatrix} 2\over r-l&0&0&0\\ 0&2\over t-b&0&0\\ 0&0&2\over n-f&0\\ 0&0&0&1\\ \end{bmatrix} Sortho= rl20000tb20000nf200001
那么正交投影的投影矩阵为: P o r t h o = S o r t h o T o r t h o = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] P_{ortho}=S_{ortho}T_{ortho} =\begin{bmatrix} 2\over r-l&0&0&-{r+l\over r-l}\\ 0&2\over t-b&0&-{t+b\over t-b}\\ 0&0&2\over n-f&-{n+f \over n-f}\\ 0&0&0&1\\ \end{bmatrix} Portho=SorthoTortho= rl20000tb20000nf20rlr+ltbt+bnfn+f1
变换过程的示意图(顺序从左到右):
在这里插入图片描述
补充: 另一种推导正交投影变换矩阵的方式
设视锥体中x轴上任意一点为
x o r t h , x o r t h ∈ [ l , r ] x_{orth}, \hspace{1mm} x_{orth} \in [l,r] xorth,xorth[l,r]
设NDC空间x轴上任意一点为
x n d c , x n d c ∈ [ − 1 , 1 ] x_{ndc}, \hspace{1mm} x_{ndc} \in [-1,1] xndc,xndc[1,1]
显然二者之间存在线性映射关系
f : x o r t h → x n d c f:x_{orth} \rightarrow x_{ndc} f:xorthxndc
可设对应关系为
A x o r t h + B = x n d c Ax_{orth}+B = x_{ndc} Axorth+B=xndc
可列出方程组如下
{   A l + B = − 1   A r + B = 1 \begin{cases} \ Al +B=-1 \\ \ Ar +B=1 \\ \end{cases} { Al+B=1 Ar+B=1
解得
{   A = 2 r − l   B = − r + l r − l \begin{cases} \ A=\frac{2}{r-l}\\ \ B=-\frac{r+l}{r-l}\\ \end{cases} { A=rl2 B=rlr+l
则二者的关系式为
x n d c = 2 r − l x o r t h − r + l r − l x_{ndc} =\frac{2}{r-l}x_{orth}-\frac{r+l}{r-l} xndc=rl2xorthrlr+l
同理可得
y n d c = 2 t − b y o r t h − t + b t − b z n d c = 2 n − f z o r t h − n + f n − f y_{ndc} =\frac{2}{t-b}y_{orth}-\frac{t+b}{t-b} \\ z_{ndc} =\frac{2}{n-f}z_{orth}-\frac{n+f}{n-f} yndc=tb2yorthtbt+bzndc=nf2zorthnfn+f
这样便能得到正交投影矩阵在齐次空间的表示形式
[ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] \begin{bmatrix} 2\over r-l&0&0&-{r+l\over r-l}\\ 0&2\over t-b&0&-{t+b\over t-b}\\ 0&0&2\over n-f&-{n+f \over n-f}\\ 0&0&0&1\\ \end{bmatrix} rl20000tb20000nf20rlr+ltbt+bnfn+f1

3)透视投影(Perspective projection)

对应透视投影而言,摄像机的可视范围是一个正四棱锥去除尖端的四棱台,为了进行透视投影,我们需要做的操作如下:

  • 将四棱台“挤压”成一个立方体
  • 按照正交投影的方式进行变换

i.“挤压”变换

首先是“挤压”四棱台的过程,这里我们如果以四棱台的一侧建立坐标系如下:
在这里插入图片描述
那么对于四棱台上一点
( x , , y , , z , ) (x^,,y^,,z^,) (x,,y,,z,)

可以通过相似三角形得出可以用x,y,z,n表示为
y , = n z y y^,=\frac{n}{z}y y,=zny
x , = n z x x^,=\frac{n}{z}x x,=znx
设“挤压”这一过程的变换矩阵为 M p − > o M_{p->o} Mp>o
则变换过程可表示为 M p − > o [ x y z 1 ] = [ x , y , z , 1 ] = [ n z x n z y z , 1 ] = [ n x n y z z , z ] M_{p->o}\begin{bmatrix}x\\ y\\ z\\ 1\\ \end{bmatrix}=\begin{bmatrix} x^,\\ y^,\\ z^,\\ 1\\ \end{bmatrix}=\begin{bmatrix} \frac{n}{z}x\\ \frac{n}{z}y\\ z^,\\ 1\\ \end{bmatrix}=\begin{bmatrix}nx\\ ny\\ zz^,\\ z\\ \end{bmatrix} Mp>o xyz1 = x,y,z,1 = znxznyz,1 = nxnyzzz
而其中z^,为未知数,不过可以发现矩阵M是四阶方阵,那么可以设M为
M p − > o = [ n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ] M_{p->o}=\begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ ?&?&?&?\\ 0&0&1&0\\ \end{bmatrix} Mp>o= n0?00n?000?100?0
显然第三行跟z^,有关,而且近平面和远平面上的任意点z坐标不会发生改变。对于近平面上任意一点,我们有:
[ x y n 1 ] = [ n x n y n 2 n ] \begin{bmatrix}x\\ y\\ n\\ 1\\ \end{bmatrix}=\begin{bmatrix}nx\\ ny\\ n^2\\ n\\ \end{bmatrix} xyn1 = nxnyn2n
那么我们就可以设矩阵M为
M p − > o = [ n 0 0 0 0 n 0 0 0 0 A B 0 0 1 0 ] M_{p->o}=\begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ 0&0&A&B\\ 0&0&1&0\\ \end{bmatrix} Mp>o= n0000n0000A100B0
如果只将矩阵M第三行对应的行向量于近平面任意一点对应的列向量相乘,则有
[ 0 , 0 , A , B ] [ x y n 1 ] = n 2 [0,0,A,B]\begin{bmatrix}x\\ y\\ n\\ 1\\ \end{bmatrix}=n^2 [0,0,A,B] xyn1 =n2
也可写为方程 A n + B = n 2 An+B=n^2 An+B=n2
同理我们可以得到远平面的方程
A f + B = f 2 Af+B=f^2 Af+B=f2
两方程联立,解得 A = n + f A=n+f A=n+f
B = − n f B=-nf B=nf

ii.透视投影变换

根据上一节正交投影变换的介绍,我们可以很容易得到透视投影变换的矩阵为:
P p e r s p = P o r t h o M p − > o P_{persp}=P_{ortho}M_{p->o} Ppersp=PorthoMp>o

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hunnybub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值