本系列文章由birdlove1987编写。转载请注明出处。

文章链接:http://blog.csdn.net/zhurui_idea/article/details/25102425

前面有一篇文章讨论过多坐标系的问题。有的人可能会问我那么多坐标系,它们之间怎么关联呢?嘿嘿~这次的内容能够为解决问题打基础奥。

线性变换基础(3D数学编程中。形式转换常常是错误的根源,所以这部分大家要多多思考,细致运算)

一般来说,方阵(就是行和列都相等的矩阵)能描写叙述随意的线性变换,所以后面我们一般用方阵来变换

事实上简单的说。线性变换就是保留直线和平行线,原点没有移动。而其它的几何性质。如长度、角度、面积和体积可能被改变

视觉的直观角度上讲,线性变换可能“拉伸”坐标系,但不会“弯曲”和“卷折”坐标系(毕竟是“线性”的变换嘛,不然可能就叫做曲线变换了)。

以下先引入一个直观的变换样例

先在单位基向量处画一个茶壶

然后我们给出一个变换矩阵

然后我们让这个茶壶的坐标按上面的矩阵经行变换

这个变换包括z轴顺时针旋转45°和不规则缩放

在讨论详细的变换之前。还必需要搞清楚。我们究竟要变换什么。在这里我们所提到的变换,其内容主要就两个:变换物体变换坐标系

变换物体,意味着变换物体上全部的点,这这点将被移动到一个新的位置,我们仍使用同一坐标系来描写叙述变换前和变换后的位置。

变换坐标。意味着物体上的点实际没有移动。我们仅仅是在另外一个坐标系中描写叙述它的位置而已。

事实上这两种变换实际上是等价的。将物体变换一个量等价于将坐标系变换一个相反的量

ps:以下我们实现的变换都是物体变换

旋转

2D中绕原点旋转的參数仅仅有一个:角度θ,它描写叙述了旋转量。(逆时针旋转常常被觉得是正方向。顺时针方向时负方向

依据几何知识我们可知旋转矩阵应该为

在3D场景中,一般都是绕轴旋转,而且在绕轴旋转θ°时,必须知道哪个方向别觉得“正”,哪个方向被觉得“负”。

在左手坐标系中定义此方向的规则为左手规则

左手坐标系
从哪里看 正方向 负方向
从轴的负端点向正端点看 逆时针 顺时针
从轴的正端点向负端点看 顺时针 逆时针

绕轴变换中最为常见的就是绕坐标轴旋转

X轴

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1cnVpX2lkZWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

可得到变换矩阵

同理得到Y轴和Z轴的变换公式

Y轴

Z轴

ps:对于随意轴的旋转,可能等我们学完了平移。将随意轴平移旋转至坐标轴变换后在移后就可以。

缩放

通过比例因子K按比例变大或缩小来缩放物体。

假设在各方向应用同比例的缩放。且沿原点“扩张”物体。那么就是均匀缩放。(均匀缩放能够保持物体的角度和比例不变)

假设须要挤压或拉伸物体,在不同方向应用不同的因子就可以,这称作非均匀缩放。(非均匀缩放时,物体角度将发生变化)

ps:假设 |k|<1 ,物体将变短。假设 |k|>1,物体变长。假设 |k|=0,就是正交投影。

最简单的缩放方法是沿着每一个坐标轴应用单独的缩放因子。

2D中有两个缩放因子。。缩放矩阵为:

缩放实例

对于3D,须要添加第三个缩放因子,3D缩放矩阵:

正交投影(平行投影)(投影意味着降维操作)

有一种投影方法是在某个方向上用零作为缩放因子。这样的情况下,全部点都被拉平至垂直的轴或平面上,这样的投影称作正交投影。

最简单的投影方式是向坐标轴或平面投影。

在2D环境下。向 x 轴投影

在2D环境下,向 y 轴投影

在3D环境下,向 xy 平面投影、向xz平面投影和向yz平面投影的矩阵

正交投影效果图

镜像(反射)

镜像是一种变换。起、其作用是将物体沿直线,或平面翻折。

ps:一个物体仅仅能镜像一次,假设再次镜像物体将翻回正面,这和在原位置旋转物体的效果一样了。

在2D环境下,沿随意轴镜像的矩阵为

当中向量n为随意轴方向的单位向量,比如假设随意轴为x轴,则n=(1,0),所以关于x轴的镜像矩阵为

在3D环境下,沿随意轴镜像的矩阵为

切变

切变是一种坐标系“扭曲”变换,非均匀地拉伸它。这是一种非常少用到的变换,它也被称作扭曲变换

切变的时候角度会发生变化,可是令人惊奇的是面积体积保持不变

切变的基本实现思想是,某一坐标的乘积加到还有一个坐标上去:x' = x + sy

在2D环境下。x坐标依据坐标y以參数s控制切变方向和向量的切变矩阵

在2D环境下。y坐标依据坐标x以參数s控制切变方向和向量的切变矩阵

3D坐标中的切变矩阵两个坐标轴别还有一个坐标轴改变的矩阵

-End-

參考文献:(1)《3D Math Primer for Graphics and Game Development》

(2)百度百科

3D数学读书笔记——矩阵基础番外篇之线性变换的更多相关文章

  1. 3D数学读书笔记——矩阵基础

     本系列文章由birdlove1987编写,转载请注明出处.    文章链接:http://blog.csdn.net/zhurui_idea/article/details/24975031   矩 ...

  2. 3D数学读书笔记——矩阵进阶

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25242725 最终要学习矩阵 ...

  3. 3D数学读书笔记——多坐标系和向量基础

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24662453 第一个知识点 ...

  4. 3D数学读书笔记——四元数

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25400659 什么是四元数 ...

  5. 3D数学读书笔记——向量运算及在c++上的实现

     本系列文章由birdlove1987编写.转载请注明出处.     文章链接: http://blog.csdn.net/zhurui_idea/article/details/24782661   ...

  6. 3D数学读书笔记——3D中的方位与角位移

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595 方位和角位移 ...

  7. openresty 学习笔记番外篇:python的一些扩展库

    openresty 学习笔记番外篇:python的一些扩展库 要写一个可以使用的python程序还需要比如日志输出,读取配置文件,作为守护进程运行等 读取配置文件 使用自带的ConfigParser模 ...

  8. openresty 学习笔记番外篇:python访问RabbitMQ消息队列

    openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...

  9. 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)

    1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...

随机推荐

  1. vs2012 有效产品密钥

    VS2012 有效注册密钥 下载地址:https://www.malavida.com/en/soft/visual-studio-2012/ Microsoft Visual Studio Ulti ...

  2. 转:ExecutorService

    在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过 Executor来启动线程比用Thread的start()更好.在新特征 ...

  3. hdu 5072 计数+容斥原理

    /* 题意: 给出n个数(n<100000), 每个数都不大于100000,数字不会有重复.现在随意抽出3个,问三个彼此互质 或者 三个彼此不互质的数目有多少. 思路: 这道题反着想,就是三个数 ...

  4. CodeWarrior的map文件详解

    前言 map文件保存了你的整个程序编译链接后的各种信息,包括编译器链接器信息,内存分配信息,对象依赖等,每次编译链接程序后,这个文件都会被覆盖重新生成. 对我来说,它最主要的作用是它详尽的描述了整个程 ...

  5. NOIP2012提高组

    D1T1.Vigenère密码 模拟 #include<iostream> #include<cstdio> using namespace std; int main() { ...

  6. js生成一周内的日期+周几

    (如有错敬请指点,以下是我工作中遇到并且解决的问题) 效果有两种: 两者区别是 1.第一天(今天)显示今日 2.第一天(今天)显示周几 (第一个图是在手机上显示的效果,第二个是PC网页上显示的效果) ...

  7. Spring与Struts2的整合

    一.复制jar文件. 把struts2-spring-plugin-..*.jar和spring.jar复制到Web工程的WEB-INF/lib目录下,并且还需要复制commons-logging.j ...

  8. 利用Redis生成业务流水号思路

    系统需要生成根据业务类型生成流水号,每天从1开始生成,第二天会清零继续从0开始,流水号格式为: bizCode + date + incr  如:TT-2017112300001. 思路:利用Redi ...

  9. Appium+python自动化15-在Mac上环境搭建【转载】

    前言 mac上搭建appium+python的环境还是有点复杂的,需要准备的软件 1.nodejs 2.npm 3.cnpm 4.appium 5.pip 6.Appium-Python-Client ...

  10. python的递归算法学习(2):具体实现:斐波那契和其中的陷阱

    1.斐波那契 什么是斐波那契,斐波那契额就是一个序列的整数的排序,其定义如下: Fn = Fn-1 + Fn-2 with F0 = 0 and F1 = 1 也就是,0,1,1,2,3,5,8,13 ...