《计算机图形学原理及实践》学习笔记之第十一章

本文介绍了3D空间中的变换,包括平移、缩放和错切。重点讨论了3D旋转,从欧拉角到旋转轴与旋转角的描述,再到旋转矩阵和四元数的表示。还提到了3D投影变换的基本理论,并对比了不同旋转表示的优缺点。四元数在3D游戏开发和图形学中用于实现平滑的旋转插值,提供了一种高效的旋转表示方法。
摘要由CSDN通过智能技术生成

第十一章 3D变换

3D空间变换与2D空间有很多类似情况:
3D空间比2D空间要多一维,所以我们视3D空间是由 ( x , y , z , w ) (x, y, z, w) (x,y,z,w) 定义的 4D空间 w=1 的子集。
平移:
[ 1 0 0 a 0 1 0 b 0 0 0 c 0 0 0 1 ] \begin{bmatrix} 1 & 0 & 0 & a \\ 0 & 1 & 0 & b \\ 0 & 0 & 0 & c \\ 0 & 0 & 0 & 1 \end{bmatrix} 100001000000abc1

旋转我们待会儿单独讨论

缩放:
[ a 0 0 0 0 b 0 0 0 0 c 0 0 0 0 1 ] \begin{bmatrix} a & 0 & 0 & 0 \\ 0 & b & 0 & 0 \\ 0 & 0 & c & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} a0000b0000c00001

错切:
[ 1 a b 0 0 1 c 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1 & a & b & 0 \\ 0 & 1 & c & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} 1000a100bc100001
上面只是错切的一个例子。错切依然会使直线上的点保持在一条直线上

还要其它的线性变换,跟2D空间下的都是类似的。

投影变换也跟2D变换类似,即在矩阵变换之后进行齐次变换。3D空间中它定义在整个平面上而不是一条直线上。

点反射:
一个点关于一个平面反射:
在这里插入图片描述

如图 x n x_n xn x x x 关于 法向为 n n n 的平面 的反射点。
可以得到 x + x ′ = ( 2 x ⋅ n ) ∗ n x + x' = (2 x \cdot n) * n x+x=(2xn)n
于是 x ′ = ( 2 x ⋅ n ) ∗ n − x x' = (2x \cdot n) * n - x x=(2xn)nx
x n = − x ′ = x − ( 2 x ⋅ n ) ∗ n x_n = -x' = x - (2x \cdot n) * n xn=x=x(2xn)n
根据该式可得出 3D空间 的反射矩阵:
I − 2 n n T = [ 1 − 2 n x 2 − 2 n x n y − 2 n x n z 0 − 2 n x n y 1 − 2 n y 2 − 2 n y n z 0 − 2 n x n z − 2 n y n z 1 − 2 n z 2 0 0 0 0 1 ] I - 2nn^T = \begin{bmatrix} 1 - 2n_x^2 & -2n_xn_y & -2n_xn_z & 0 \\ -2n_xn_y & 1 - 2n_y^2 & -2n_yn_z & 0 \\ -2n_xn_z & -2n_yn_z & 1 - 2n_z^2 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} I2nnT=12nx22nxny2nxnz02nxny12ny22nynz02nxnz2nynz12nz200001
不好记,直接记 I − 2 n n T I - 2nn^T I2nnT 就完事儿了, I I I 是单位矩阵, n n n 为平面法向

投影变换理论

3D空间的投影变换是 4D空间 w=1 子空间内的线性变换。它表示为一个 4x4矩阵 M M M 和 紧接着的 齐次变换。齐次变换:
H ( x , y , z , w ) = ( x w , y w , z w , 1 ) H(x, y, z, w) = (\frac{x}{w}, \frac{y}{w}, \frac{z}{w}, 1) H(x,y,z,w)=(wx,wy,wz,1)
那么,如果 矩阵M 的最后一维 与 点乘积得到的结果为 0,即 点经过 矩阵M 变换后 w = 0,
那么此时 齐次变换变得无意义,这里我们认为 该点 经过投影变换后 被变换到了 无穷远处。

旋转

3D空间的旋转 比 2D空间的旋转要复杂。在 2D空间中,我们认为 点是在 xy平面,旋转就是绕 z轴旋转。而在 3D空间,我们的点可以绕 x、y、z 三个轴旋转。
绕 z 轴,即在 xy平面上的旋转矩阵 我们在 2D空间变换中已经给出:
R x y ( θ ) = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] R_xy(θ) = \begin{bmatrix} cosθ & -sinθ & 0 \\ sinθ & cosθ & 0 \\ 0 & 0 & 1 \end{bmatrix} Rxy(θ)=cosθsinθ0sinθcosθ0001
绕 x 轴,即在 yz平面上的旋转矩阵:
R y z ( θ ) = [ 1 0 0 0 c o s θ − s i n θ 0 s i n θ c o s θ ] R_yz(θ) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & cosθ & -sinθ \\ 0 & sinθ & cosθ \end{bmatrix} Ryz(θ)=1000cosθsinθ0sinθcosθ
绕 y 轴,即在 xz平面上的旋转矩阵:
R x z ( θ ) = [ c o s θ 0 s i n θ 0 1 − s i n θ 0 c o s θ ] R_xz(θ) = \begin{bmatrix} cosθ & 0 & sinθ \\ 0 & 1 & \\ -sinθ & 0 & cosθ \end{bmatrix} Rxz(θ)=cosθ0sinθ010sinθcosθ

关于这三个轴的旋转,我们可以用 欧拉角表示

欧拉角

欧拉角 是一种基于三种较简单旋转运动(称为 俯仰、滚动 和 偏航)创建一般旋转的机制。
用欧拉角表示旋转,易于人的理解,即将一个物体的旋转拆解为该物体绕 x、y、z 三个轴的旋转。
其矩阵就为 绕三个轴旋转的矩阵乘积:
M = [ 1 0 0 0 c o s φ − s i n φ 0 s i n φ c o s φ ] [ c o s θ 0 s i n θ 0 1 0 − s i n θ 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值