计算机图形学-GAMES101-3

news2024/11/26 16:39:54

一、transformation-变换

(1)Scale

  • 缩放变换示意图
    在这里插入图片描述

  • 图形每个像素对应坐标的计算公式
    在这里插入图片描述

  • 写成缩放矩阵的形式
    在这里插入图片描述

  • 非均匀缩放
    在这里插入图片描述

(2)Reflection Matrix

  • 镜面变换示意图
    在这里插入图片描述

  • 图形每个像素对应坐标的计算公式
    在这里插入图片描述

  • 写成镜像矩阵的形式
    在这里插入图片描述

(3)Shear Matrix

  • 切变变换示意图
    在这里插入图片描述

  • 写成切片矩阵的形式
    在这里插入图片描述

(4)Rotate

  • 旋转变换示意图
    在这里插入图片描述

  • 旋转默认以原点为旋转中心,旋转方式为逆时针旋转。在这里插入图片描述

  • 旋转矩阵
    在这里插入图片描述

(5)总结

  • 我们要做变换,就要找到变换前坐标和变换后坐标之间的一种关系,根据这种关系将原坐标变换为新坐标,并将坐标和变换写成矩阵形式。
    在这里插入图片描述

二、齐次坐标

(1)平移

  • 平移变换示意图
    在这里插入图片描述

  • 图形每个像素对应坐标的计算公式
    在这里插入图片描述

  • 由于是相加,所以我们只能写成这种形式:
    在这里插入图片描述

  • 可以发现平移变换不是线性变换,无法表述为之前变换的形式,即坐标矩阵乘以一个矩阵的形式。有没有一个办法可以统一的表示所有的变换方式呢?

(2)No free lunch

  • 没有付出就没有收获,诸如动态规划是一种用空间换时间的求解算法,想要更好的表达方式,就需要牺牲一些东西。使用齐次坐标即可统一表述方式。

  • 使用齐次坐标实现平移变换。在这里插入图片描述

(3)齐次坐标的介绍

  • 点和向量齐次坐标的表示,向量w=0代表了向量的平移不变性。
    在这里插入图片描述

  • 也表述了向量+向量=向量、点-点=向量 等运算规则。
    在这里插入图片描述

  • 扩展齐次坐标下点w分量的含义
    在这里插入图片描述

三、齐次坐标的变换

(1)变换

  • Affine Transformations在这里插入图片描述

  • 任何一个 Affine Transformations都可以写为变换矩阵形式。
    在这里插入图片描述

  • 变换对应的矩阵
    在这里插入图片描述

(2)逆变换

  • 逆变换对应原变换矩阵的逆矩阵(AM=B,AM-M=B-M,A=B-M)。
    在这里插入图片描述

(3)变换顺序的讨论

  • 变换的顺序:缩放->旋转->平移。因为定义旋转是围绕原点,所有必须保证旋转时未经过平移,因此旋转在平移之前。因为定义缩放一般是我们针对原图形进行的横纵向缩放,即缩放时我们认为图形的横向为x轴纵向为y轴,而旋转会导致图形横向和纵向偏移,所以缩放需要在旋转之前进行。

  • 所有任何复杂的变换都可以通过这些基本变换得到,即定义在一个变换矩阵中。如果当对图形进行过旋转和平移了,还想对其进行缩放,可以先将图形逆变换到缩放阶段,然后执行缩放变换,再执行原本的旋转和平移变换即可。

  • 注意矩阵乘法类似于函数映射y=F(x),所以变换矩阵M和位置矩阵x的乘法为Mx,为左乘。对坐标的变换如下图,会从右到左依次应用各个变换矩阵。
    在这里插入图片描述

  • 矩阵从右到左逐个应用。也可也认为是,从An×A(n-1)×…×A1=M,即计算出变换矩阵M应用到坐标上。
    在这里插入图片描述

  • 如果有一个变换,它要求基于原点以外一个点旋转,或者是要求基于x轴和y轴以外的轴进行缩放,那该怎么办?对于绕原点以外的点旋转,我们只需要平移物体,使得旋转点平移到原点(保证了旋转点和物体的相对位置不变),再开始绕着原点旋转,这样就得到了应该旋转得到的效果,只不过我们还要将物体平移回去而已。而对于缩放也是一样,我们将旋转轴旋转到x轴上,进行x轴上的缩放,然后再旋转回原本的缩放方向即可。注意变换矩阵是从右到左的变换顺序。
    在这里插入图片描述

  • 存在变换顺序是因为变换的规则是固定的,而针对上述本身就打破了变换规则的变换,需要打破变换顺序才可以得到实现。但是无论在任何时候,我们想要旋转物体,只需要保证旋转中心在原点,我们需要缩放物体,只需要保证缩放轴在x或y轴上。这样我们可以先通过简单的变换使得旋转中心在原点或者缩放轴在x轴上,我们即可实施不规则的旋转或缩放。任何变换都是有对应的关系的,如果你能设计出一种变换关系,那你也可以不基于这些基本的变换,比如之间绕某个点旋转。

四、三维变换

(1)三维的齐次坐标

  • 添加z坐标即可。在这里插入图片描述

  • w不等于0,则点的坐标为:
    在这里插入图片描述

  • 三维变换矩阵,其中3X3为线性变换,旁边一列为平移变换在这里插入图片描述

  • 变换的顺序,上图矩阵等价下图计算过程,因此变换顺序也是先线性变换后平移。
    在这里插入图片描述

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

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

相关文章

阿里HR:年轻人你把握不住.....

前言 去阿里面试测试工程师,这里面水太深,什么未来规划,职业发展的东西都是虚拟的,作者还太年轻,没有那个经历,把握不住。项目只有几个,开心快乐就行,不PK,文明PK。 很…

文心一言 VS chatgpt (17)-- 算法导论4.1 3~4题

三、在你的计算机上实现最大子数组问题的暴力算法和递归算法。请指出多大的问题规模n0是性能交叉点一一从此之后递归算法将击败暴力算法?然后,修改递归算法的基本情况一一当问题规模小于 n0 时采用暴力算法。修改后,性能交叉点会改变吗? 文心一言&…

进程间通信(匿名管道、命名管道、共享内存)

目录 匿名管道 创建管道---pipe() 命名管道 创建FIFO FIFO 操作 用命名管道实现server&client通信 共享内存 1.创建共享内存函数shmget() 2.获得共享内存地址函数shmat() 3.删除共享内存函数shmdt() 4.共享内存控制函数shmctl() 在Linux下的多个进程间的通信机制…

Unittest单元测试框架之unittest的第三方库paramunittest参数化基础及应用

一、unittest参数化介绍 参数化测试用于当需要使用多组不同的测试数据测试同一个方法的时候 paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例 实现unittest参数化的方式有多种,如ddt、paramunittest等…

Linux-进程信号

Linux-进程信号 一,信号入门信号的概念生活中的信号技术应用角度的信号使用kill -l 查看信号列表信号的处理方式 二,信号产生通过终端按键产生信号Core Dumpcode dump标志位 通过系统调用向进程发信号killraiseabort 由软件条件产生信号SIGPIPESIGALRM 硬…

三届跻身世界级,长沙国际工程机械展的突破之路

文 | 智能相对论 作者 | 易不二 长沙正在成为全球工程机械企业争相奔赴的产业“盛宴”。 近日完美落幕的第三届长沙国际工程机械展,留下了全球30多个国家、1500余家企业“同台竞技”的精彩亮相,并达成了536亿元的现场交易额。 卡特彼勒、日立、沃尔沃…

2022年蓝桥杯:第十三届蓝桥杯大赛软件赛省赛C/C++大学B组真题(考后回顾,文末附真题链接)

目录 第十三届蓝桥杯大赛软件赛省赛C/C大学B组真题(考后回顾)试题 A: 九进制转十进制试题 B: 顺子日期试题 C: 刷题统计试题 D: 修剪灌木试题 E: X 进制减法试题 F: 统计子矩阵试题 G: 积木画试题 H: 扫雷试题 I: 李白打酒加强版试题 J: 砍竹子 第十三届…

【JavaStript】

目录 🐷1. JavaScript 的书写形式 🛩1.1 行内式 💛 1.2 内嵌式 🍗1.3 外部式 🍿2. JavaScricpt 的一些常用语句 🛴2.1 输入:prompt 👽2.2 输出:alert &#x1f…

Linux线程间的同步和互斥 进程间传统通信方式 5.16

Linux线程间的同步和互斥 同步:有顺序的考虑 按照约定的顺序相互配合完成一件事情(红绿灯) {释放 产生 资源1(V操作);;申请 资源-1(p操作)} 信号量代表某一类资源&am…

RocketMQ整理

RocketMQ在阿里云上的商业版本,集成了阿里内部一些更深层次的功能及运维定制。开源版本,功能上略有缺失,但大体上是一样的。 使用Java开发,便于深度定制。最早叫MetaQ。消息吞吐量虽然依然不如Kafka,但是却比RabbitMQ高很多。在阿里内部,RocketMQ集群每天处理的请求数超过…

监控需求来源及主流方案对比

我们从开始了解监控系统来说,首先我们要先了解监控的需求来源,即监控系统都可以用于做什么? 监控需求来源 其实最初的需求很简单,即"系统出问题了我们要能及时感知"。后面随着技术的不断发展,我们对监控系统提出了更…

Linux的超级用户及权限

目录 一:Linux下的两个用户 二:权限 1:目录文件 文件创建的默认权限 2:普通文件 一:Linux下的两个用户 在使用Linux的时候会有两个身份,第一个是普通用户,普通用户在很多方面是受阻的,原因就是权限不够,在这种情况下就有一个超级用户,也…

iOS图片系列一 图片的基本属性

图片在项目的开发中使用频率很高,但是绝大部分都是作为普通的展示或者偶尔需要裁剪,并不需要对图片做什么特别的处理,最近做了一个项目对于图片的需求功能比较多,踩了很多坑的同时也对图片的使用有了更深的理解,整理下…

C++面经:初始化全局变量和未初始化全局变量有什么区别

全局变量初始化而且初始值不为0,那么这样的全局变量是放在内存的.data段的,如果全局变量初始值为0或者未初始化,那么这样的全局变量是放在.bss段的。 考点: 考察C/C语言内存模型,.data,.bss段存放的内容。 …

Windows shell环境: 从git bash切换到msys2

文章目录 1. 目的2. msys2 环境 (Environment)3. 升级 MSYS2: 使用 pacman 滚动式升级整个系统4. 在 Windows Terminal 中增加显示 MSYS25. 使用 zsh6. VSCode 中的配置增加 MSYS2 终端配置 git 路径 7. 安装 C/C 依赖库安装 ag查询 bison 和 flex 的安装目录 8. References 1.…

ES6模块化规范

在没有ES6模块化规范前,有像AMD、CMD这样的浏览器模块化规范,还有像CommonJS这样的服务端模块化规范。 2015年,JS终于推出了官方的模块化规范,为了统一各种规范,我们简称ES6 模块化。 ES6目前作为JS的内置模块化系统&a…

Spring的创建和使用,存储和读取Bean总结

目录 Spring项目创建和使用流程 1.创建一个 Spring 项目 2.存储 Bean 3.读取 Bean ApplicationContext和BeanFactory的区别 通过注解存储 Bean对象 五大类注解的关系 Java程序标准分层 方法注解Bean 注入Bean对象的三种方式 1.属性注入 2.Setter注入 3.构造方法注入…

【Java数据结构】Map和Set

Map和Set 搜索树概念操作 - 查找操作 - 插入操作 - 删除cur没有左树(cur.left null)cur没有右树(cur.right null)cur既有左树也有右树(最困难的情况)替罪羊删除法 操作代码性能分析和 java 类集的关系 搜…

程序员困局:去大城市进大厂却买不了房,回老家又没有高薪工作…

对于在外打拼的程序员来说,难的是进大厂,而不是买不起房。 进大厂的程序员,能不能买得起房? 进大厂的程序员的薪资,还是相当可观的。以阿里P6为例,年薪50万,到手40万左右,刨去10万…

【C++学习】C++11——新特性 | 右值引用 | 完美转发

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! C11——新特性 | 右值引用 | 完美转发 👀列表初始化🦴 std::initializer_list…