计算机图形学入门03:二维基本变换

news2024/11/9 9:49:10

        变换(Transformation)可分为模型(Model)变换和视图(Viewing)变换。在3D虚拟场景中相机的移动和旋转,角色人物动画都需要变换,用来描述物体运动。将三维世界投影变换到2D屏幕上成像出来,也需要变换。

 1.缩放变换

        如上图所示,把一个图形缩小为原来的0.5倍,那么就需要x坐标变为0.5倍,y坐标也变为0.5倍,这样的变换叫做缩放(Scale)变换。可以用以下表达式表示:

        可以用矩阵的形式表示如下:

        上面的矩阵表达式针对x轴和y轴进行相同比例的缩放,实际中两个方向上的缩放可能不相同,把矩阵表达式修改如下:

        Sx表示在x轴方向上缩放的倍数,Sy表示在y轴方向上缩放的倍数。

2.反射变换

        反射(Reflection)变换也可称为镜像变换,如下图所示:

        如上图需要将物体以y轴进行镜像,那么可以用以下表达式表达:

        用矩阵形式的表达如下:

        当然还有其他方向的反射矩阵。

3.切变变换

        如上图这个变换好像是拽着图形的右上角沿着x轴向右拉了一段距离,称为切变(Shear)变换

        提示:

        1.y=0时,水平位移为0

        2.y=1时,水平位移为a(当y=0.5时,水平位移是0.5a,即y*a)

        3.垂直位移总是0

        通过以上三个提示的规律可得出任何x轴上的位移为a*y,表示移动距离等于原本x位置加上a*y,即x’=x+a*y,而y轴的值始终不变,即y’=y。用矩阵表达为如下:

4.旋转变换

        说旋转(Rotation),默认指的是绕原点(0,0)逆时针旋转,下图是物体绕原点逆时针旋转θ角的示意图:

        以上变换同样可以写成矩阵的形式:

推导如下

        1.首先确认要达到的目标位置(x’,y’),假设原点(x,y)。

        2.用矩阵形式表示:

        如此需要求得a,b,c,d四个未知数。

        3.所有旋转的点都要符合最终公式,包括特殊点。先找出特殊点A(1,0),将A点旋转\theta度,通过三角定律可得A的坐标变成(\sin \theta\cos \theta),假设当前就是以A点为原始点,进行了\theta度的旋转。那么带入后矩阵表示:\begin{bmatrix} \cos \theta \\ \sin \theta \end{bmatrix}=\begin{bmatrix} a & b\\ c& d \end{bmatrix}\begin{bmatrix} 1\\ 0 \end{bmatrix}。通过矩阵相乘可得:cos\theta=a*1+b*0,sin\theta=c*1+d*0,所以a=cos\theta,c=sin\theta

        4.同理使用B(0,1)这个特殊点旋转\theta度,求得b=-sin\theta,d=cos\theta

5.线性变换

        前面提到的变换都可以使用以下表达式表示:

        用矩阵都可以如下表示:

        继而表示为:输出坐标 = 变换矩阵 × 输入坐标 的形式:

        满足以上条件的变换称为线性(Linear)变换

5.齐次坐标

5.1仿射变换

        如上图所示,沿x轴平移tx,沿y轴平移ty,这样是一个平移变换。可以用以下表达式表示:

       你会发现,它无法用前面熟悉的线性变换矩阵的形式表示,也就是说平移变换是非线性变换。 只能用以下矩阵形式表示,上面把这种变换称为非线性变换,其实它有专门的名字叫仿射(Affine)变换。

        为了方便统一,不希望平移变换是一个特例,那么是否有一个统一的方式来表示所有的变换?通过不断探索,引入了齐次坐标(Homogeneous coordinates)

5.2什么是齐次坐标

        我们可以在现在二维上,再增加一个维度,变成三维,在坐标系上添加第三个坐标(W坐标),如果在卡尔坐标系上有点(x,y),当转换为齐次坐标后这个点变为(wx,wy,w)。反过来同样适用,如果在其次坐标系中有一个点(x,y,w),转换到笛卡尔坐标系下,这个点应该表示为(x/w,y/w)。如此,对于任何一个点和任意一个向量,我们都可以表示如下:

       注意:这里为什么点是加1,而向量是加0呢?因为向量是个方向,平移后还是原来的向量,具有平移不变性质。如果有一个向量(x,y,0),同样经过上图矩阵这么一个变换,得到的结果仍然希望是(x,y,0),添加0是为了保护向量在平移变换过程中不发生变化。

将点(x,y)表示成(x,y,1),平移变换可写成如下矩阵形式:

         所以像如下这种仿射变换表达式:

        通过引入齐次坐标后,可以使用线性变换的形式表达(根据上图所示,表示先线性变换再平移变换的)。

        所以就有了统一所有变换的表达式。可以发现最后变换矩阵最后一行都是0,0,1。

6.二维主要变换总结

         引入了齐次坐标后,二维变换表达式分别变成了如下:

        缩放矩阵

        旋转矩阵

        上述旋转矩阵是绕原点逆时针旋转的变换矩阵,当需要得到顺时针旋转的变换矩阵时,可以通过逆变换(后面内容)得到,即

        通过上面两个矩阵对比发现,在旋转矩阵里面,旋转矩阵的逆就是旋转矩阵的转置。利用这个性质,求旋转的逆,也就是求反方向旋转相同角度的时候,只要写出正向旋转矩阵,把矩阵转置过来就可以了。

        如果一个矩阵的转置等于这个矩阵的逆,我们称这个矩阵是正交矩阵。

        平移矩阵

        注意:一般二维变换下,除了平移矩阵,都用2*2的矩阵表示。

7.逆变换

        一个物体做一个变换,变换完以后要恢复到原来的位置,变换回原来的位置的过程称为逆(Inverse)变换,逆变换在数学上的实现是乘以变换矩阵的逆矩阵。

8.组合变换

        组合(Composite)变换就是对一个物体进行多个变换。如下图所示,左边图片通过某些变换后变成右边的图片。

可以有两种变换:

        1.先向右平移1个单位,再旋转45度(默认都是绕原点、逆时针旋转)。

        2.先旋转45度,后向右平移1个单位。

        发现第一种变换方式并没有达到想要的效果,而第二种方式达到了目的。

得出两个结论:

        1.一个复杂的变换,可以通过几个简单的变换得到。

        2.变换的顺利不同最终的结果也会不同,因为矩阵相乘是不满足交换律的,矩阵相乘顺序不同结果就会不同(特殊除外)。

注意:矩阵的应用是从右到左的,将上述组合变换用矩阵表达如下(先旋转,再平移):

组合变换矩阵相乘应用的顺序

        上图中A1,A2一直到An表示变换矩阵,一个点进行组合变换时,应用在该点的矩阵是从右到左。即矩阵An乘An-1一直乘到A1,实际应用到点的顺序是A1,A2一直到An。

矩阵乘法结合律使用

        矩阵相乘无法使用交换律,但是可以使用结合律。

        一个点做多个变换即多个矩阵相乘再乘以这个点,根据矩阵乘法结合律,可以先把这些矩阵相乘,乘完在与这个点相乘,只要保证矩阵相乘的顺序不变即可。假设A1到An都为3*3的矩阵,那么相乘的结果还是3*3的一个矩阵,那么就可以把很多个矩阵合成一个矩阵,简化了公式。

        所以上述例子的表达式可以简化为:

        同理,矩阵不仅能合成,还能够分解。前面最开始图就是把变换分解成了旋转变换和平移变换。

9.非原点的旋转变换

        在上述中,默认旋转变换是绕原点进行的,那么不是绕原点的变换该怎么实现呢?可以先把变换分解,分为三个步骤变换:

        1.将旋转中心移动到原点(所有点移动)

        2.在原点做旋转变换

        3.平移到原点的位置

        综上得出结论,先平移T(-c)到原点,然后旋转R(α),最后平移到原来位置T(c)。矩阵变换作用在物体上的顺序是从右到左,所以矩阵表达式表示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1714512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社区供稿丨GPT-4o 对实时互动与 RTC 的影响

以下文章来源于共识粉碎机 ,作者AI芋圆子 前面的话: GPT-4o 发布当周,我们的社区伙伴「共识粉碎机」就主办了一场主题为「GPT-4o 对实时互动与 RTC 的影响」讨论会。涉及的话题包括: GPT-4o 如何降低延迟(VAD 模块可…

图片怎样在线改像素大小?电脑快速修改图片大小的方法

在设计图片的时候下载的图片尺寸一般会比较大,在网上使用经常会因为尺寸的问题导致无法正常上传,那么如何快速在线改图片大小呢?想要修改图片尺寸可以在直接选择网上的图片改大小工具的功能来快速完成修改,操作简单方便使用&#…

M功能-支付平台(六)

target:离开柬埔寨倒计时-217day 今天突然发现我在csdn居然把我ip属地搞出来了,之前都没注意到,哎 前言 M功能演示版本做到后期(也就是第二周的后面3天)真的很心酸,这边安排的4后端后面都放弃了,觉得做不出来&#…

python Z-score标准化

python Z-score标准化 Zscore标准化sklearn库实现Z-score标准化手动实现Z-score标准化 Zscore标准化 Z-score标准化(也称为标准差标准化)是一种常见的数据标准化方法,它将数据集中的每个特征的值转换为一个新的尺度,使得转化后的…

设置自动刷新数据透视表的数据源

数据透视表数据源的自动刷新 一般情况操作: 自动刷新操作: 1、定义名称名称 引用位置:OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1)) 2、数据透视表的数据源更改为【源数据】—— 即前面定义的名称 3、数据——全部…

香港优才计划找中介是否是智商税,靠谱中介又该如何找?

关于香港优才计划的申请,找中介帮助还是自己DIY,网络上充斥的声音太多,对不了解的人来说,难以抉择的同时还怕上当受骗。 这其中很容易误导人的关键在于——信息差! 今天这篇文章的目的就是想让大家看清一些中介和DIY…

ResNet 原理剖析以及代码复现

原理 ResNet 解决了什么问题? 一言以蔽之:解决了深度的神经网络难以训练的问题。 具体的说,理论上神经网络的深度越深,其训练效果应该越好,但实际上并非如此,层数越深会导致越差的结果并且容易产生梯度爆炸…

Scapy:用Python编写自己的网络抓包工具

随着Python越来越流行,在安全领域的用途也越来越多。比如可以用requests 模块撰写进行Web请求工具;用sockets编写TCP网络通讯程序;解析和生成字节流可以使用struct模块。而要解析和处理网络包在网络安全领域更加普遍,时常我们会使…

Vue——事件修饰符

文章目录 前言阻止默认事件 prevent阻止事件冒泡 stop 前言 在官方文档中对于事件修饰符有一个很好的说明,本篇文章主要记录验证测试的案例。 官方文档 事件修饰符 阻止默认事件 prevent 在js原生的语言中,可以根据标签本身的事件对象进行阻止默认事件…

数组-给出最大容量,求能获得的最大值

一、问题描述 二、解题思路 这个题目其实是求给出数组中,子数组和不大于M中,和最大值的子数组。 求子数组使用双指针就可以解决问题,相对比较简单。(如果是子序列,则等价于0-1背包问题,看题目扩展中的问题…

C++笔试强训day36

目录 1.提取不重复的整数 2.【模板】哈夫曼编码 3.abb 1.提取不重复的整数 链接https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1?tpId37&tqId21232&ru/exam/oj 按照题意模拟就行&#xff0c;记得从右往左遍历 #include <iostream> usi…

Vue——计算属性 computed 与方法 methods 区别探究

文章目录 前言计算属性的由来方法实现 计算属性 同样的效果计算属性缓存 vs 方法 前言 在官方文档中&#xff0c;给出了计算属性的说明与用途&#xff0c;也讲述了计算属性与方法的区别点。本篇博客只做自己的探究记录&#xff0c;以官方文档为准。 vue 计算属性 官方文档 …

彻底理解浏览器的进程与线程

彻底理解浏览器的进程与线程 什么是进程和线程&#xff0c;两者的区别及联系浏览器的进程和线程总结浏览器核心进程有哪些浏览器进程与线程相关问题 什么是进程和线程&#xff0c;两者的区别及联系 进程和线程是操作系统中用于管理程序执行的两个基本概念进程的定义及理解 定义…

PHPSTOM配置Laradock,xdebug,phpunit

原理图&#xff1a; 片面理解&#xff1a; phpstorm启用一个9000端口&#xff0c;这个端口用来接收到信息后&#xff0c;启用xdebug功能。服务器端(docker), 当客户端访问laravel项目域名后, 并读取xdebug.ini的配置, 把调试的请求数据, 向配置里面的端口发送消息, 配置里面的端…

QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

如何在phpMy管理对Joomla后台的登录密码进行重置

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何在phpMy管理对Joomla后台的登录密码进行重置&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希…

​用 ONLYOFFICE 宏帮你自动执行任务:介绍与教程

使用 ONLYOFFICE 宏&#xff0c;可以来自动实现一些操作节省更多时间和精力。在本文中&#xff0c;我们集合了一些关于宏的教程&#xff0c;带您了解宏的工作原理&#xff0c;以及一些实例展示。 什么是 ONLYOFFICE 宏 如果您是一名资深 Microsoft Excel 用户&#xff0c;那么…

大数据报告有什么作用?查询方式一般有几种?

随着互联网金融的飞速发展&#xff0c;网络借贷已经成为了一种常见的融资方式。然而&#xff0c;如何在众多的平台中做出正确的选择&#xff0c;避免风险并实现最大利益&#xff0c;这就需要一份具有参考价值的大数据报告。本文将详细阐述大数据报告的作用及查询方式的几种方式…

ROS2贪吃龟练习工程

本文是ROS2基础知识的综合小应用&#xff0c;练习如何创建工作包&#xff0c;创建Node&#xff0c;定义Topic和Service&#xff0c;以及通过LaunchFile启动多个节点。基础知识可以参考&#xff1a;ROS2基础编程&#xff0c;ROS2 Topics和Services&#xff0c;ROS2 LaunchFile和…

模拟集成电路(5)----单级放大器(共栅级)

模拟集成电路(5)----单级放大器&#xff08;共栅级&#xff09; 有一些场合需要一些小的输入电阻&#xff08;电流放大器&#xff09; 大信号分析 − W h e n V i n ≥ V B − V T H ∙ M 1 i s o f f , V o u t V D D − F o r L o w e r V i n I d 1 2 μ n C o x W L ( V…