文章目录

  • 平移、旋转、缩放
    • 平移
    • 旋转
      • 1. 沿x轴旋转
      • 2. 沿y轴或者z轴旋转
    • 缩放

是时候整理一波3d变换相关的知识了。模型的变换可以认为是空间中一堆点的变换,三维空间中,(x,y,z)可以认为是点,也可以认为是一个向量,因此,人们引入的第4个维度来标识是点还是向量,这个4维空间就叫 仿射空间,具体可以参考 CV及CG数学基础:空间,在仿射空间中,(x,y,z,0)标识向量,而(x,y,z,1)表示点。

平移、旋转、缩放

平移

平移没什么好说的,(x,y,z,1)向x,y,z轴分别移动a,b,c单位长度后变成(x+a, y+b, z+c, 1)。写成矩阵相乘的方式即为:

[x+ay+bz+c1]=[100a010b001c0001][xyz1]\left[ \begin{matrix} x+a \\ y+b \\ z+c \\ 1\\ \end{matrix} \right] = \left[ \begin{matrix} 1 & 0 & 0 & a\\ 0 & 1 & 0 & b \\ 0 & 0 & 1 & c \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ 1\\ \end{matrix} \right] ⎣⎢⎢⎡​x+ay+bz+c1​⎦⎥⎥⎤​=⎣⎢⎢⎡​1000​0100​0010​abc1​⎦⎥⎥⎤​⎣⎢⎢⎡​xyz1​⎦⎥⎥⎤​

旋转

对于旋转,任何一个旋转都可以认为是沿着x,y,z轴分别旋转 α\alphaα, β\betaβ, γ\gammaγ 度数,所以选旋转就先讲沿着某个轴向的旋转。这里以逆着坐标轴正向方向看去的顺时针为旋转的正向,就是你的视线朝向和坐标轴正向是相反的,(⊙o⊙)…我还是画个图吧,下图就是沿着z轴旋转的正向了哈~

1. 沿x轴旋转


嗯!这里推一波公式,其实很简单,就是三角函数。
如上图左边,A点沿着x轴旋转一定角度变成A’,为了更容易看,右图是左图的左视图,记旋转的角度为θ\thetaθ, 旋转后得到的A’与旋转中心连线与y轴正方向的夹角为α\alphaα(图中的α\alphaα是个负值),记A’与旋转中心连线的长度为L(A与旋转中心连线的长度也是L),那么,显而易见,有:

x′=xy′=L⋅cos(θ+α)z′=L⋅sin(θ+α)\begin{aligned} x' =& x\\ y' =& L·cos(\theta + \alpha)\\ z' =& L·sin(\theta + \alpha) \end{aligned} x′=y′=z′=​xL⋅cos(θ+α)L⋅sin(θ+α)​

y=L⋅cosαz=L⋅sinα\begin{aligned} y =& L·cos\alpha\\ z =& L·sin\alpha \end{aligned} y=z=​L⋅cosαL⋅sinα​
根据三角函数公式可以得到
y′=L⋅cos(α−θ)=L⋅(cosαcosθ−sinαsinθ)=ycosθ−zsinθz′=L⋅sin(α−θ)=L⋅(sinθcosα+cosθsinα)=ysinθ+zcosθ\begin{aligned} y' =& L·cos(\alpha - \theta) = L·(cos\alpha cos\theta - sin\alpha sin\theta) = ycos\theta -zsin\theta\\ z' =& L·sin(\alpha - \theta) = L·(sin\theta cos\alpha + cos\theta sin\alpha ) = ysin\theta + zcos\theta \end{aligned} y′=z′=​L⋅cos(α−θ)=L⋅(cosαcosθ−sinαsinθ)=ycosθ−zsinθL⋅sin(α−θ)=L⋅(sinθcosα+cosθsinα)=ysinθ+zcosθ​
综上,有:
x′=xy′=ycosθ−zsinθz′=ysinθ+zcosθ\begin{aligned} x' =& x\\ y' =& ycos\theta -zsin\theta\\ z' =&ysin\theta + zcos\theta \end{aligned} x′=y′=z′=​xycosθ−zsinθysinθ+zcosθ​
现在就可以写成漂亮的矩阵形式了:
[x′y′z′1]=[10000cosθ−sinθ00sinθcosθ00001][xyz1]\left[ \begin{matrix} x' \\ y' \\ z' \\ 1\\ \end{matrix} \right] = \left[ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & cos\theta & -sin\theta & 0 \\ 0 & sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ 1\\ \end{matrix} \right] ⎣⎢⎢⎡​x′y′z′1​⎦⎥⎥⎤​=⎣⎢⎢⎡​1000​0cosθsinθ0​0−sinθcosθ0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​xyz1​⎦⎥⎥⎤​

2. 沿y轴或者z轴旋转

推了x轴的,其他两个轴向其实原理都是一样的。
对于y轴,可以简单把y轴和x轴对调,也就是公式里的x,y对调,不过这样子的话,z轴的方向会反过来,所以再把z相关的加个符号就好了。
公式如下:
y′=yx′=xcosθ+zsinθz′=−xsinθ+zcosθ\begin{aligned} y' =& y\\ x' =& xcos\theta +zsin\theta\\ z' =&-xsin\theta +zcos\theta \end{aligned} y′=x′=z′=​yxcosθ+zsinθ−xsinθ+zcosθ​
写成漂亮的矩阵形式就是:
[x′y′z′1]=[cosθ0sinθ00100−sinθ0cosθ00001][xyz1]\left[ \begin{matrix} x' \\ y' \\ z' \\ 1\\ \end{matrix} \right] = \left[ \begin{matrix} cos\theta &0 & sin\theta & 0 \\ 0 & 1 & 0 & 0\\ -sin\theta & 0 & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ 1\\ \end{matrix} \right] ⎣⎢⎢⎡​x′y′z′1​⎦⎥⎥⎤​=⎣⎢⎢⎡​cosθ0−sinθ0​0100​sinθ0cosθ0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​xyz1​⎦⎥⎥⎤​

对于z轴,x,z互换,y置反,直接上公式:
z′=zy′=ycosθ+xsinθx′=−ysinθ+xcosθ\begin{aligned} z' =& z\\ y' =& ycos\theta +xsin\theta\\ x' =&-ysin\theta + xcos\theta \end{aligned} z′=y′=x′=​zycosθ+xsinθ−ysinθ+xcosθ​
矩阵形式:
[x′y′z′1]=[cosθ−sinθ00sinθcosθ0000100001][xyz1]\left[ \begin{matrix} x' \\ y' \\ z' \\ 1\\ \end{matrix} \right] = \left[ \begin{matrix} cos\theta & -sin\theta&0 & 0 \\ sin\theta & cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ 1\\ \end{matrix} \right] ⎣⎢⎢⎡​x′y′z′1​⎦⎥⎥⎤​=⎣⎢⎢⎡​cosθsinθ00​−sinθcosθ00​0010​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​xyz1​⎦⎥⎥⎤​
那一个物体沿着x,y,z 轴分别旋转α\alphaα, β\betaβ, γ\gammaγ 度数就把3个矩阵相乘就好了。

[x′y′z′1]=[cosγ−sinγ00sinγcosγ0000100001][cosβ0sinβ00100−sinβ0cosβ00001][10000cosα−sinα00sinαcosα00001][xyz1]\left[ \begin{matrix} x' \\ y' \\ z' \\ 1\\ \end{matrix} \right] = \left[ \begin{matrix} cos\gamma& -sin\gamma&0 & 0 \\ sin\gamma& cos\gamma& 0 & 0 \\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} cos\beta&0 & sin\beta& 0 \\ 0 & 1 & 0 & 0\\ -sin\beta& 0 & cos\beta& 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & cos\alpha & -sin\alpha & 0 \\ 0 & sin\alpha & cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ 1\\ \end{matrix} \right] ⎣⎢⎢⎡​x′y′z′1​⎦⎥⎥⎤​=⎣⎢⎢⎡​cosγsinγ00​−sinγcosγ00​0010​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​cosβ0−sinβ0​0100​sinβ0cosβ0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​1000​0cosαsinα0​0−sinαcosα0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​xyz1​⎦⎥⎥⎤​
[x′y′z′1]=[cosβcosγsinαsinβcosγ−sinγcosαsinβcosαcosγ+sinαsinγ0cosβsinγcosαcosγ+sinαsinβsinγ−sinαcosγ+sinγsinβcosα0−sinβsinαcosβcosαcosβ00001][xyz1]\left[ \begin{matrix} x' \\ y' \\ z' \\ 1\\ \end{matrix} \right] = \left[ \begin{matrix} cos\beta cos\gamma & sin\alpha sin\beta cos\gamma - sin\gamma cos\alpha & sin\beta cos\alpha cos\gamma +sin\alpha sin\gamma & 0\\ cos\beta sin\gamma & cos\alpha cos\gamma + sin\alpha sin\beta sin\gamma & -sin\alpha cos\gamma + sin\gamma sin\beta cos\alpha & 0 \\ -sin\beta & sin\alpha cos\beta& cos\alpha cos\beta& 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ 1\\ \end{matrix} \right] ⎣⎢⎢⎡​x′y′z′1​⎦⎥⎥⎤​=⎣⎢⎢⎡​cosβcosγcosβsinγ−sinβ0​sinαsinβcosγ−sinγcosαcosαcosγ+sinαsinβsinγsinαcosβ0​sinβcosαcosγ+sinαsinγ−sinαcosγ+sinγsinβcosαcosαcosβ0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​xyz1​⎦⎥⎥⎤​

缩放

缩放感觉也没的说,直接上公示,下面公式表示沿着x,y,z轴分别缩放a,b,c倍:
[x′y′z′1]=[a0000b0000c00001][xyz1]\left[ \begin{matrix} x' \\ y' \\ z' \\ 1\\ \end{matrix} \right] = \left[ \begin{matrix} a & 0 & 0 & 0\\ 0 & b & 0 & 0 \\ 0 & 0 & c & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ z \\ 1\\ \end{matrix} \right] ⎣⎢⎢⎡​x′y′z′1​⎦⎥⎥⎤​=⎣⎢⎢⎡​a000​0b00​00c0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​xyz1​⎦⎥⎥⎤​

3d变换基础:平移、旋转、缩放(仿射变换)详解——公式推导相关推荐

  1. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  2. OpenCV-Python图像处理:仿射变换详解及案例

    仿射变换博文传送门(带星号的为付费专栏文章): *图像仿射变换原理1:齐次坐标来龙去脉详解 *图像仿射变换原理2:矩阵变换.线性变换和图像线性变换矩阵 *图像仿射变换原理3:仿射变换类型及变换矩阵详解 ...

  3. Keras深度学习实战(1)——神经网络基础与模型训练过程详解

    Keras深度学习实战(1)--神经网络基础与模型训练过程详解 0. 前言 1. 神经网络基础 1.1 简单神经网络的架构 1.2 神经网络的训练 1.3 神经网络的应用 2. 从零开始构建前向传播 ...

  4. 零基础入门 Unity 之 UGUI 详解专栏 | 寻找C站宝藏

    零基础入门 Unity 之 UGUI 详解专栏 | 寻找C站宝藏 六大推荐理由 理由一:系统 理由二:详细 理由三:专业 理由四:图解 理由五:深度 理由六:实例 一键直达:<UGUI 控件详解 ...

  5. [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. 前端基础-HTML的的标签详解

    阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...

  7. 关于计算机应用基础问题,《计算机应用基础》习题及问题详解

    <计算机应用基础>习题及问题详解 (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实用文档第一章 计算机基础知识填空题 ...

  8. get方法报空指针_C++基础教程之指针拷贝详解

    C++基础教程之指针拷贝详解 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此.特别是在C++中,如果不注意处理类中的指针,非常容易出问题.如果朋友们不相信可以看看下面的代码: ...

  9. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  10. 纹理基础知识和过滤模式详解

    转载自 纹理基础知识和过滤模式详解 1. 为什么在纹理采样时候需要 texture filter (纹理过滤) 我们的纹理 要贴到三维图形表面,而三维图形上的pixel中心与纹理上的texel中心并不 ...

最新文章

  1. 进入Xcode4,选择菜单“Product”-“Profile”,快捷键Command+I 监测内存泄露
  2. 图像篡改检测pytorch版本
  3. 2016.11.30
  4. 漫谈IBM Power VM历史及其特点
  5. boost::asio 笔记
  6. php 迭代和递归,实战PHP数据结构基础之递归
  7. 6.2阻碍循环(Cyclic Barriers)
  8. sql系列(基础篇)-第一章 关于sysdate
  9. 发一个成熟好用的电池供电切换电路
  10. 如何把手机变成你的救生设备
  11. ps滤镜下载大全-PSCC 64位滤镜收集
  12. 两道CTF Reverse题目(windows平台)
  13. 测试覆盖:语句覆盖 判定覆盖(即分支覆盖) 条件覆盖 判定-条件覆盖 条件组合覆盖 路径覆盖
  14. PS如何制作火焰效果图特效步骤教程
  15. MATLAB ~的用法
  16. 如何调节肠道菌群?常见天然物质、益生菌、益生元的介绍
  17. 【Pandas分组聚合】进阶:透视表、交叉表(pivot_table() 、crosstab())
  18. 在OCC7.6中,gp_vector和gp_dir和gp_axis有什么区别
  19. list.stream.filter常用方式
  20. warning Replace `············` with `······`

热门文章

  1. 使用Git将代码上传到Gitee仓库
  2. 理解线性代数,矩阵运算,行列式
  3. transfrom用法
  4. C#Winform中窗体的美化
  5. oracle 把结果加上百分号_用一条sql语句显示数据百分比并加百分号
  6. Docker学习(一):基础理论基础操作
  7. 史上最严数据保护条例欧盟GDPR今日生效,你可能需要这版中文全文(下)
  8. 分销代理商管理系统有哪些功能?
  9. SpringBoot使用Workbook读取excel中内容
  10. 【Latex】高级插入图片技巧: 双栏中如何正确插入图片 + 如何多图