123789456ye

已AFO

计算机图形学入门笔记(一)(L1-L4)

课程传送门

L1 Overview of Computer Graphics

概述。不多讲。

L2 Review of Linear Algebra

线代复习,一些基本操作。不多讲。

L3 Transformation

变换。
直接上三维+齐次坐标版吧。
坐标\((x,y,z)\)表示为

\[\begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix} \]

以下所有矩阵使用时全部左乘在坐标矩阵上。

恒等变换(identity)

略。

平移变换(translation)

\[trans(d_x,d_y,d_z)= \begin{bmatrix} 1&0&0&d_x \\ 0&1&0&d_y \\ 0&0&1&d_z \\ 0&0&0&1 \end{bmatrix}\]

表示将坐标\((x,y,z)\)平移到\((x+d_x,y+d_y,z+d_z)\)

缩放变换(scaling)

\[scale(s_x,s_y,s_z)= \begin{bmatrix} s_x&0&0&0 \\ 0&s_y&0&0 \\ 0&0&s_z&0 \\ 0&0&0&1 \\ \end{bmatrix}\]

表示将坐标\((x,y,z)\)缩放至\((x*s_x,y*s_y,z*s_z)\)
avater

剪切变换(shearing)

这是对\(x\)轴作用的矩阵

\[shear(d_y,d_z)= \begin{bmatrix} 1&d_y&d_z&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ 0&0&0&1 \end{bmatrix}\]

表示将坐标\((x,y,z)\)剪切至\((x+y*d_y+z*d_z,y,z)\)
可以想象为x轴被拉伸,其它轴不动。
二维的例子:
avater

旋转变换(rotation)

注意,这里以右手系为例!
以下内容假定有对右手系和叉乘的认识
avater
以下的绕某轴意思是:沿某轴正方向看过去,顺时针旋转多少
某轴正方向:从该轴负半轴取一个点,从该点指向原点
别问我为什么变成了顺时针,我也不知道
x->y(绕z轴)

\[rotate_z(\theta)= \begin{bmatrix} cos\theta& -sin\theta& 0& 0\\ sin\theta& cos\theta& 0& 0\\ 0&0&1&0\\ 0&0&0&1 \end{bmatrix} \]

意思是\(z\)轴不动,\(x,y\)两个坐标按平面上的直接旋转。
y->z(绕x轴)

\[rotate_x(\theta)= \begin{bmatrix} 1&0&0&0 \\ 0& cos\theta& -sin\theta& 0\\ 0& sin\theta& cos\theta& 0\\ 0&0&0&1 \end{bmatrix} \]

意思是\(x\)轴不动,\(y,z\)两个坐标按平面上的直接旋转。
x->z(绕y轴)
注意:仔细看上面那张坐标系的图,可以发现按照右手螺旋定则
\(z\times x=y\)
但是我们需要的是从\(x\)轴到\(z\)
所以我们从\(x\)轴转到\(z\)\(\theta\),实际上是从\(z\)轴转到\(x\)\(-\theta\)角,所以旋转矩阵写法稍微有一点变化

\[rotate_y(\theta)= \begin{bmatrix} cos\theta&0&sin\theta&0 \\ 0&1&0&0 \\ -sin\theta&0&cos\theta&0\\ 0&0&0&1 \end{bmatrix} \]

绕任意轴的旋转
首先我们把这个轴旋转到\(x\)轴上(打个比方)
其次旋转角度直接分解成三根轴的角度,三个矩阵乘起来
最后再把这个轴转回去
听起来很简单是不是


这有个公式叫做\(\text{Rodrigues' rotation formula}\)
中文名:罗德里格斯旋转公式
\(V\)为待旋转向量,\(K\)为旋转轴(单位向量!所以不用考虑大小),\(\theta\)为旋转角,方向依右手螺旋定则

\[V_{rot}=Vcos\theta+(K\times V)sin\theta+K(K*V)(1-cos\theta) \]


证明:
avater
似乎都是从wiki上翻译的?不管了
所以首先对\(V\)分解为平行与\(K\)和垂直于\(K\)的两个分量

\[V_{\parallel}=K(K*V) \]

\[V_{\bot}=-K\times(K\times V) \]

这个可以看图理解
所以

\[V_{rot}=V_{\parallel}+V_{rot\bot} \\ V_{rot\bot}=cos\theta*V_{rot}+sin\theta*(K\times V_{\bot})\\ K\times V_{\bot}=K\times(V-V_{\parallel})=K\times V\]

所以把结果全部代回

\[V_{rot}=V_{\parallel}+cos\theta(V-V_{\parallel})+sin\theta(K\times V) \]

整理得到上面那个公式
另外有一个矩阵形式
由于叉乘可以写成矩阵形式
对于\(K=[K_x,K_y,K_z]^{T}\),有叉积矩阵,用的时候直接左乘

\[\pmb{K}=\begin{bmatrix} 0&-K_z&K_y \\ K_z&0&-K_x \\ -K_y&K_x&0 \end{bmatrix} \]

所以公式可以写成

\[\begin{aligned} V_{rot}&=Vcos\theta+(K\times V)sin\theta+K(K*V)(1-cos\theta)\\ &=V-(1-cos\theta)(K*K)V+(1-cos\theta)(K*V)K+sin\theta \pmb{K}V\\ &=V+(1-cos\theta)[(K*V)K-(K*K)V]+sin\theta\pmb{K}V\\ &=V+(1-cos\theta)[K\times(K\times V)]+sin\theta\pmb{K}V\\ &=[\pmb{I}+(1-cos\theta)\pmb{K^2}+sin\theta \pmb{K}]V \end{aligned}\]

第二行是因为\(K*K=1\)
第四行是向量三重积的性质

\[\pmb{R}=\pmb{I}+sin\theta\pmb{K}+(1-cos\theta)\pmb{K^2}\\ \pmb{V_{rot}}=\pmb{R}\pmb{V}\]

posted @ 2020-07-09 10:08  123789456ye  阅读(379)  评论(0编辑  收藏  举报