计算机图形学 第6章 三维变换与投影

news2024/9/27 23:34:14

目录

# 学习要求

前置知识

三维几何变换总的式子:

 平移变换

比例变换

旋转变换:绕x轴旋转

反射变换

错切变换

三维复合变换

坐标系变换 

 正交投影矩阵 

 三视图

斜投影定义

透视投影

 透视变换坐标系  

 ## 代码

透视投影分类     


# 学习要求

  • 熟练掌握三维几何变换矩阵
  • 掌握正交投影
  • 掌握斜投影
  • 熟练掌握透视投影

前置知识

三维变换同样引入了齐次坐标技术,在四维空间(x,y,z,w)内进行讨论。

 定义了规范化齐次坐标以后,三维图形几何变换就可以表示为物体顶点集合的规范化齐次坐标矩阵某一变换矩阵相乘的形式。(似曾相识呢)

用规范化齐次坐标表示的三维图形几何变换矩阵是一个4×4方阵,简称为三维几何变换矩阵

 基本上往下都是围绕三个坐标轴来展开计算了。

三维几何变换总的式子:

 平移变换

比例变换

旋转变换:绕x轴旋转

 

反射变换

 

好吧,没想到还有关于平面的反射。

错切变换

 


三维复合变换

总的式子

 T的原式在上面。

   在三维基本几何变换中,比例变换和旋转变换是与参考点相关

相对任一参考点Qx,y,z)的比例变换和旋转变换应表达为复合变换形式

变换方法是(似曾相识)

  1. 首先将参考点平移到坐标原点,相对于坐标原点作比例变换或旋转变换,
  2. 然后再进行反平移将参考点平移回原位置。

相对于任意方向的变换方法是

  1. 首先对任意方向做旋转变换,使变换方向与某个坐标轴重合,
  2. 然后对该坐标轴进行三维基本几何变换,
  3. 最后做反向旋转变换,将任意方向还原到原来的方向。

三维几何变换中需要进行两次旋转变换,才能使任意方向与某个坐标轴重合。

  • 一般做法是先将任意方向旋转到某个坐标平面内,然后再旋转到与该坐标平面内的某个坐标轴重合。

看清楚嗷,是谁绕谁旋转。

 

 

 

 

 

 

坐标系变换 

      在进行三维观察时,需要将物体的描述从世界坐标系变换到观察坐标系,然后通过旋转视点可以观察物体的全貌。
      同一种变换既可以看作是点变换也可以看作是坐标系变换。点变换是顶点位置发生改变,但坐标系位置不发生改变。坐标系变换是建立新坐标系描述旧坐标系内的顶点,坐标系位置发生改变,但顶点位置不发生改变。  
 

 正交投影矩阵 

 三视图

一个物体有6个视图:从物体的前面向后面投射所得的视图称主视图,从物体的上面向下面投射所得的视图称俯视图,从物体的左面向右面投射所得的视图称侧视图,还有其它三个视图不是很常用。

 主视图

 俯视图

 

 侧视图

 

 使用上述三视图变换矩阵绘制的三视图虽然位于都同一平面内,但却彼此相连。这对于使用不同的视区单独绘制主视图、俯视图和侧视图,不会产生影响。 

 

斜投影定义

将三维物体向投影面内作平行投影,但投影方向不垂直于投影面得到的投影称为斜投影

正交投影相比,斜投影具有较好的立体感

斜投影也具有部分类似正交投影的可测量性,平行于投影面的物体表面的长度和角度投影后保持不变。

 

透视投影

 与平行投影相比,透视投影的特点是所有投影线都从空间一点(称为视点投影中心)投射,

离视点近的物体投影大,离视点远的物体投影小,小到极点消失,称为灭点vanishing point)。

一般将屏幕放在观察者和物体之间。投影线与屏幕的交点就是物体上一点的透视投影。

视点代表人眼或照相机、摄像机的位置,是观察坐标系的原点。视心屏幕坐标系的原点

 透视变换坐标系  

 

 

 

 

 

 

 ## 代码

void CTestView::InitParameter()
{
        //初始化三角函数
	k[1]=sin(PI*Theta/180); 
	k[2]=sin(PI*Phi/180);
	k[3]=cos(PI*Theta/180);
	k[4]=cos(PI*Phi/180);
	k[5]=k[2]*k[3];
	k[6]=k[2]*k[1];
	k[7]=k[4]*k[3];
	k[8]=k[4]*k[1];
        //世界坐标系的视点球坐标
	ViewPoint.x=R*k[6]; 
	ViewPoint.y=R*k[4];
	ViewPoint.z=R*k[5];
}

 编程实现将物体的坐标描述从世界坐标系转换到
观察坐标系,函数WorldToView() :

void CTestView::WorldToView(CP3 WorldP)
{
	CP3 ViewP;
	ViewP.x=k[3]* WorldP.x-k[1]* WorldP.z; 
	ViewP.y=-k[8]* WorldP.x+k[2]* WorldP.y-k[7]* WorldP.z;
	ViewP.z=-k[6]* WorldP.x-k[4]* WorldP.y-k[5]* WorldP.z+R;
}

WorldP观察坐标系三维点,ViewP为观察坐标系的三维点。本段代码完成了将世界坐标系中一点的坐标表示转换到观察坐标系中表示。

 

 

 

CP2 CTestView::PerProject(CP3 ViewP)
{
        CP2 ScreenP;// ScreenP屏幕坐标系二维点
	 ScreenP.x=d*ViewP.x/ViewP.z;
        ScreenP.y=Round(d*ViewP.y/ViewP.z); 
        return ScreenP;
}

本段代码将观察坐标系中的三维点ViewP透视投影

转换为屏幕坐标系中的二维点ScreenP

透视投影分类     

透视投影中,与屏幕平行的平行线投影后仍保持平行。

不与屏幕平行的平行线投影后汇聚为灭点,灭点是无限远点在屏幕上的投影。

每一组平行线都有其不同的灭点。坐标轴上灭点称为主灭点

透视投影中主灭点数目是由屏幕切割坐标轴的数量来决定,并据此将透视投影分类为一点、二点和三点透视。

一点透视有一个主灭点,即屏幕仅与一个坐标轴正交,与另外两个坐标轴平行;

二点透视有两个主灭点,即屏幕仅与两个坐标轴相交,与另一个坐标轴平行;

三点透视有三个主灭点,即屏幕与三个坐标轴都相交

 

 

物体是三维坐标系,屏幕是二维坐标系。投影就是将三维转换为二维,也就是处理掉z坐标。     

        观察坐标系的三维坐标转换为屏幕坐标系的二维坐标的方法有以下几种:

 

 

 

 

式中,NearFar是常数,且Near就是视距d。透视变换的一个重要性质是把直线映射为直线,平面映射为平面。 

 

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

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

相关文章

怎么把图片做成gif动图?三步搞定gif在线制作

在日常办公、生活中经常会使用一些gif动态图片,生动有趣画面丰富。很好奇这些gif动图是怎么制作的吧!其实,制作gif表情包的方法很简单,给大家分享几个简单实用的gif制作(https://www.gif.cn/)方法&#xff…

ccflow 代码——流程讲义

爬虫组件分析目录概述需求:设计思路实现思路分析1.表单引擎模版表系统框架Jflow 对使用者的要求参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,…

CV——day71 零基础学YOLO:YOLOv2

YOLOv25. YOLOv25.1 YOLOv2升级概述5.2 YOLOv2网络架构5.3 基于聚类提取先验框5.4 偏移量计算方法5.5 坐标映射与还原5.6 感受野的作用5.7 特征融合改进5.7.1 多尺度检测5.8 YOLOv2 总结5. YOLOv2 5.1 YOLOv2升级概述 可以看出,v2的map相比v1改进了很多&#xff0c…

KafkaProducer线程安全吗?

这是我今天面试被问的一个问题&#xff0c;这会回来就来看看源码 先看KafkaProducer的构造函数 public KafkaProducer(Map<String, Object> configs) { this((ProducerConfig)(new ProducerConfig(configs)), (Serializer)null, (Serializer)null); } public KafkaPro…

[MRCTF2020]PixelShooter1题解

Android一词最早出现于法国作家利尔亚当&#xff08;Auguste Villiers de lIsle-Adam&#xff09;在1886年发表的科幻小数《未来的夏娃》&#xff08;Lve future&#xff09;中。他将外表像人的机器起名为Android。 本题是一个安卓逆向 1.下载到手机玩一玩 是一个32位文件下载…

2-JVM、JRE、JDK的作用及联系和区别

在Java环境配置和项目启动中&#xff0c;这三者的配置是项目启动的基础保证。 JVM(Java Virtual Machine)&#xff0c;Java虚拟机&#xff0c;就是一个虚拟的用于解析bytecode字节码的”虚拟计算机”。一般与OS操作系统打交道。是整个java实现跨平台的最核心的部分【使用Java编…

GlobalPointer:用统一的方式处理嵌套和非嵌套NER

本文将介绍一个称为GlobalPointer的设计&#xff0c;它利用全局归一化的思路来进行命名实体识别&#xff08;NER&#xff09;&#xff0c;可以无差别地识别嵌套实体和非嵌套实体&#xff0c;在非嵌套&#xff08;Flat NER&#xff09;的情形下它能取得媲美CRF的效果&#xff0c…

大数据专业前景怎么样?

大数据专业毕业生未来的岗位选择空间比较大&#xff0c;有三大类岗位可选择分别是大数据开发岗位、大数据分析岗位和大数据运维岗位&#xff0c;在不同的行业和技术体系结构下这些岗位也包含很多细分的岗位。 大数据开发岗位分为平台研发岗位和行业场景开发岗位两大类&#xf…

latex自己记录需要的

参考:LaTeX 公式篇 推荐网站&#xff1a;LaTeX公式编辑器&#xff0c;有模板 换行 $$ \begin{array}{c} 1\\ 2\\ 3\\ \end{array} $$123\begin{array}{c} 1\\ 2\\ 3\\ \end{array} 123​ 公式拆分 $$ \begin{split} 123 & 33 \\ &6 \end{split} $$123336\begin{split}…

找工作不用愁,送你一份Salesforce面试秘籍!

在之前的文章中&#xff0c;自由侠部落为学习者梳理了Salesforce架构师的面试秘籍&#xff0c;将其拆解为了3个方面——分享工作经验、展示技术知识以及证明领导能力&#xff0c;上篇文章已经展示了工作经验部分&#xff0c;接下来将继续分享面试秘籍&#xff0c;帮助求职者顺利…

linux内核之netlink通信

Linux内核(04)之netlink通信 Author&#xff1a;Onceday Date&#xff1a;2023年1月3日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; netlink 机制 binarydady 阿里云开发者社区linux中通用Netlink详解及使用剖析 binarydady 阿里云开发者社区RFC 3549 Linux N…

测试员最不愿遇到的18个测试问题,怎么解决?

测试员最不愿遇到的18个测试问题&#xff0c;怎么解决&#xff1f; 目录&#xff1a;导读 测试员最不愿遇到的18个测试问题&#xff0c;怎么解决&#xff1f; 一 测试充分度&#xff08;Test Sufficiency&#xff09; 二 测试有效性&#xff08;Test Effectiveness&#x…

人大金仓数据库-表的定义

表的定义 使用子查询来创建表 通过复制student表创建student_m表&#xff0c;只复制原表中的部分数据到新表 通过复制course表创建course01表&#xff0c;复制原表中的全部数据到新表 使用LIKE语法来创建表 非空约束会默认复制到新表中 create table t03(LIKE t02 INCLUDING…

设计循环队列

前言&#xff1a;队列中有一种特殊的存在——环形队列&#xff0c;其有一定的价值与意义&#xff0c;这篇文章主要由一道与其相关的例题来引出相关的知识内容。 注&#xff1a;下述解题过程是用C语言实现。 目录 一&#xff1a;题目简述 二&#xff1a;环形队列的简单介绍 …

什么是Docker?看这一篇干货文章就够了!

什么是Docker容器技术的起源容器技术 vs 虚拟机什么是容器什么是docker如何使用dockerdocker是如何工作的docker的底层实现总结作为程序员我们应怎样理解docker&#xff1f; 容器技术的起源 假设你们公司正在秘密研发下一个“今日头条”APP&#xff0c;我们姑且称为明日头条&…

ORB-SLAM3算法和代码学习——重定位Relocalization

0总述 重定位是ORB-SLAM系列保持跟踪稳定性的保障&#xff0c;从ORB-SLAM沿用至ORB-SLAM3。主要作用是在跟踪失败时&#xff0c;通过词袋向量搜索在关键帧数据库中寻找和当前帧相似的关键帧作为匹配帧&#xff0c;建立数据关联并计算当前帧的位姿&#xff0c;恢复相机的运动。…

正大国际期货:外盘短线交易九大生存准则:从亏损预期出发

一、生存是第一位 这并不是陈词滥调&#xff0c;投机是非常危险的活动。投机非并输赢那样简单&#xff0c;首要的任务是在顶峰和谷底之间的波动中生存&#xff0c;如果连生存都做不到&#xff0c;你根本就没有谈及赢的资格。 即使有了好的资金管理、正确的系统和行动的前提&a…

Ubuntu18.04下安装配置AndroidStudio软件图文教程

运行环境&#xff1a;操作系统为Ubuntu18.04&#xff0c;android-studio版本为2022.1.1.19-linux&#xff0c;Java版本为jdk8,安装路径/opt/android-studio/,当前用户为xqf222,sdk下载路径默认为/home/xqf222/Android/Sdk 详细步骤和指令如下&#xff1a; 1.安装JDK8&#xf…

VTK CT重建(一) MPR 多层面重建 四视图

除了MPR之外&#xff0c;在CT重建后处理中还有很多别的常用方法&#xff0c;包括 多层面重建&#xff08;MPR&#xff09;最大密度投影&#xff08;MIP&#xff09;最小密度投影&#xff08;MinIP&#xff09;表面阴影遮盖&#xff08;SSD&#xff09;容积漫游技术&#xff08…

go validator参数校验器自定义规则及提示(自定义异常返回提示语)

原文连接&#xff1a;https://segmentfault.com/a/1190000040445612 笔者针对参数为指针的情况做了一点小优化 这里我们用validator用来做参数校验&#xff0c;gin默认的github.com/go-playground/validator&#xff0c;可以直接使用 除此之外还有一些其他的工具也挺好用的&am…