D3D12学习笔记3.3——仿射变换

·仿射变换是由一个线性变换与一个平移变换组合而成。对于向量来说平移操作是没有意义的,而平移变换只能应用于点。

·齐次坐标表示,是将原先的三元组扩展成四元组,第四个坐标w的取值将根据被描述对象是点还是向量而定。

具体如下:

w=0是向量,w=1是点。


·说完两个基本概念后,我们来说说仿射变换的具体公式:a(u)=\iota (u)+b

同时矩阵表示法:

a(u)=uA+b=[x,y,z]\begin{bmatrix} A_{11} & A_{12} &A_{13} \ A_{21} & A_{22} &A_{23} \ A_{31}& A_{32} & A_{33} \end{bmatrix}+\begin{bmatrix} b_x & b_y &b_z \end{bmatrix}=\begin{bmatrix} x^{'} & y^{'} & z^{'} \end{bmatrix}

其中A是一个线性变换的矩阵表示。

如果用w=1把坐标扩充为齐次坐标,那么就可以简洁地写作:

\begin{bmatrix} x & y &z &1 \end{bmatrix}\begin{bmatrix} A_{11} & A_{12} &A_{13}&0 \ A_{21} & A_{22} &A_{23} &0\ A_{31}& A_{32} & A_{33}&0\b_x&b_y&b_z&1 \end{bmatrix}=\begin{bmatrix} x^{'} & y^{'} & z^{'}&1 \end{bmatrix}

这样4 x 4矩阵称为仿射变换的矩阵表示。


下面来说说平移的一些细节:

·恒等变换是一种直接返回其输入参数的线性变换,I(u)=u。其实就是单位矩阵的线性变换矩阵。

·平移变换定义为仿射变换,其中线性变换就是一种恒等变换,即\iota (u)=uI+b=u+b

·矩阵表示其实很简单:

T=\begin{bmatrix} 1 & 0 &0&0 \ 0 & 1 &0 &0\ 0& 0 & 1&0\b_x&b_y&b_z&1 \end{bmatrix}

这就是平移矩阵,其逆矩阵也很简单:

T=\begin{bmatrix} 1 & 0 &0&0 \ 0 & 1 &0 &0\ 0& 0 & 1&0\-b_x&-b_y&-b_z&1 \end{bmatrix}

·最后我们来讲之前一节讲的缩放、旋转矩阵代入到仿射矩阵中:

S=\begin{bmatrix} S_x & 0 &0&0 \ 0 & S_y &0 &0\ 0& 0 & S_z&0\0&0&0&1 \end{bmatrix},R_{n}=\begin{bmatrix} c+(1-c)x^2) & (1-c)xy+sz & (1-c)xz-sy&0\ (1-c)xy-sz & c+(1-c)y^2) & (1-c)yz+sx&0\ (1-c)xz+sy& (1-c)yz-sx& c+(1-c)z^2) &0\0&0&0&1\end{bmatrix}

这样就能用4 x 4 矩阵统一的表示所有变换,并通过1 x 4齐次行向量来表示点和向量了。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )