计算机图形学 第9章 自由曲线曲面

news2025/1/10 14:01:27

第8章不学

目录

# 学习目标

# 消隐

## 定义

1.线框模型

2.表面模型

 3.实体模型

双表结构

定义三维顶点类

 定义表面类

读入立方体的点表

 读入立方体的面表

 1.柏拉图多面体

柏拉图多面体对偶性

 正四面体

 正八面体

正十二面体

黄金数

黄金矩形

黄金三角形

 光滑物体

球面

 圆柱面

圆锥面

 圆环面

隐线算法(考) ⭐⭐⭐

凸多面体消隐算法

 曲面体消隐算法

隐面算法

深度缓冲器算法 / Z-Buffer算法

 深度排序算法/画家算法



# 学习目标

  • - 了解物体的三种模型表示方法
  •  - 掌握柏拉图多面体的建模方法
  • - 掌握常见曲面体的建模方法
  • - 熟练掌握凸多面体的背面剔除算法
  • - 熟练掌握曲面体的背面剔除算法
  • - 熟练掌握深度缓冲算法
  • - 熟练掌握深度排序算法

# 消隐

## 定义


要生成具有真实感的图形,就要在给定视点和视线方向之后,决定场景中物体哪些线段或表面是可见的,哪些线段或表面是不可见的。这一问题习惯上称为消除隐藏线和消除隐藏面,简称为消隐

我们常见的三维物体,这些物体可以采用线框模型描述,也可以采用表面模型实体模型描述。无论使用哪种模型描述,都需要为物体建立顶点表、边表和面表构成的数据结构

建立三维用户坐标系为右手系Oxyzx轴水平向右为正,y轴垂直向上为正,z轴从纸面指向观察者。

几何信息:描述几何元素空间位置的信息。

拓扑信息:描述几何元素之间相互连接关系的信息。

    描述一个物体不仅需要几何信息的描述而且需要拓扑信息的描述。因为只有几何信息的描述,在表示上存在不惟一性

1.线框模型

线框模型(wireframe model)是计算机图形学中表示物体最早使用的模型,而且一直在使用。

线框模型只是用几何体的边线来表示物体的外形,没有表面和体积等概念

线框模型是表面模型和实体模型的基础,只使用顶点表边表两个数据结构就可以描述。图9-5所示为立方体线框模型。

  • 优点:可以产生任意方向视图,视图间保持正确的投影关系,常用于绘制三视图或斜轴测图等。
  • 缺点:所有棱边全部绘制出来,容易产生二义性,如图9-6所示
     

2.表面模型

表面模型(surface model)是利用物体的外表面来构造模型,就如同在线框模型上蒙上了一层外皮,使物体具有了一层外表。

表面模型仍缺乏体积的概念,是一个物体的空壳。与线框模型相比,表面模型增加了一个面表,用以记录边面之间的拓扑关系。

  • 优点:可以对表面进行平面着色或光滑着色、可以为物体添加光照或纹理等。
  • 缺点:无法进行实体之间的并交叉运算。

9-7表示的是双三次Bezier曲面的网格模型。

9-8表示的是双三次Bezier曲面的表面模型。

在图9-8中,Bezier曲面没有围成一个封闭的空间,只是一张很薄的面片,其表面无内外之分,哪面是正面、哪面是反面,没有给出明确的定义。

 

 3.实体模型

实体模型solid model)是在封闭的表面模型内部进行了填充,有了如体积和重量等特性,能反映立体的真实性,立体才具有的概念。它的内部和外部的概念,定义了在表面模型的哪一侧存在实体。它的表面有正面和反面之分。如图9-9所示。

有向棱边隐含地表示表面的外法向量方向。常用右手准则定义,拓扑合法的物体在相邻两个面的公共边界上,棱边的方向正好相反,如图9-10所示。

    与表面模型数据结构的差异。将面表的顶点索引号按照从物体外部观察的逆时针方向的顺序排列,可确切地分清体内体外。

   与线框模型、表面模型的区别。记录了顶点的信息,以及线、面、体的拓扑信息。

   实体模型常采用集合论中的并、交、差等运算来构造复杂实体 。

一般情况下,使用顶点表、边表和面表3张表可以方便地检索到物体的任意一个顶点、任意一条边和任意一个表面,而且数据结构清晰。

    实际建模中,实体模型采用了有向棱边,相邻两个表面上共享的一条棱边的定义方向截然相反,导致无法确定棱边的顶点连接顺序,因而放弃边表,仅使用顶点表和面表来表示物体的几何模型。

且面表中按照表面法矢量向外的方向遍历多边形顶点索引号,表明处理的是物体的正面。仅用顶点表和面表的缺点是物体的每条边被重复绘制2次。

双表结构

 9-4根据立方体的展开图重新设计了面表结构。

 

定义三维顶点类

如图9-12所示,包括顶点的三维坐标(x,y,z)

 

 定义表面类

如图9-13,表面类包括表面的顶点数和表面的顶点索引号。

SetNum()用于动态设置表面的顶点数,常用于处理3个顶点的三角形面片或4个顶点的四边形面片。

 

读入立方体的点表

在程序中定义ReadVertex()函数读入物体的顶点表如图9-14

 读入立方体的面表

在程序中定义ReadFace()函数读入物体的面表,如图9-15

 1.柏拉图多面体

定义:

正多面体是由若干个全等的正多边形围成,并且相交在各个顶点上的棱边数都相等的凸多面体

正多面体只有正四面体、正六面体、正八面体、正十二面体和正二十面体五种,如图9-16 所示。表9-5给出了其几何信息。这五种多面体统称为柏拉图多面体。柏拉图多面体属于凸多面体

在几何学中,若一种多面体的每个顶点均能对应到另一种多面体上的每个面的中心,二者互称为对偶多面体。(相互的关系)

柏拉图多面体对偶性

 

 正四面体

建立正四面体的伴随立方体可以很容易地确定正四面体的顶点表和面表。

 

 

 正八面体

 

 

正十二面体

 

 

 

 

 

 

 

黄金数

把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,0.618被称为黄金分割数

 

黄金矩形

金矩形分割为两块,其中一块为正方形,另一块为黄金为矩形,可以递归划分。

黄金三角形

 

 

 

 

 光滑物体

多面体是由平面多边形组成的物体,多面体没有方程表示形式,用顶点表和面表直接给出数据结构定义。

        对于球、圆柱、圆锥、圆环等光滑物体,表面有确定的参数方程表示形式。

绘制光滑物体时,需要进行网格划分,即把光滑曲面离散为平面多边形表示,这些多边形一般为平面四边形或三角形网格。

光滑物体的网格顶点表和面表使用物体的参数方程离散计算后得到。

球面

 

 

 

 

 圆柱面

假定圆柱的中心轴与y轴重合,横截面是半径为r的圆,圆柱的高度沿着y轴方向从0拉伸到h,三维坐标系原点O位于底面中心 ,如图9-35所示。

 

 适当加大周向和纵向划分的网格数,圆柱面网格模型趋向光滑。

圆锥面

假定圆锥的中心轴与y轴重合,横截面的最大半径为r,最小半径为0,圆锥的高度沿着y轴方向从0拉伸到h,三维坐标系原点O位于底面中心 ,如图9-41所示。

 圆锥侧面的离散化表示如图9-42所示,侧面使用三角形网格和四边形网格逼近 。

圆锥底面使用三角形网格逼近,如图9-43所示。

 

 圆环面

 

 

 适当加大周向和纵向划分的网格数,圆环面网格模型趋向光滑。


根据消隐方法的不同,消隐算法可分为两类

(1隐线算法。用于消除物体上不可见的边界线。隐线算法主要是针对线框模型提出的,它只要求画出物体的各可见棱边,如图9-51所示。

2隐面算法。用于消除物体上不可见的表面。隐面算法主要是针对表面模型提出的,一般不绘制物体的可见棱边,只使用指定颜色填充物体的各可见表面,如图9-52所示。

计算机图形学的创始人Sutherland根据消隐空间的不同,将消隐算法分为3类:

1)物体空间法。物体空间消隐算法主要在三维观察空间中完成。根据模型的几何关系来判断哪些表面可见,哪些表面不可见。

2)图像空间法。图像空间消隐算法主要在物体投影后的二维图像空间中利用帧缓冲信息确定哪些表面遮挡了其它表面。图像空间法受限于显示器的分辨率。

3)物像空间法。在描述物体的三维观察空间和二维图像空间中同时进行消隐。

隐线算法(考) ⭐⭐⭐

凸多面体消隐算法

 很好理解。

 

 

 

立方体消隐前的透视变换图如图9-54所示,画出了全部6个表面的线框;消隐后的透视变换图如图9-55所示,只画出可见的表面棱边。 

 

 

 曲面体消隐算法

曲面体可以采用有限单元法划分为若干个小曲面区域。常采用四边形平面片或三角形平面片来逼近曲面体。

      消隐主要是确定各四边形平面片或三角形平面片的可见性,与凸多面体消隐类似,即用外法矢量和视矢量的数量积来进行可见性检测。

 

 

 

 

隐面算法

从视点的角度观察物体的表面,离视点近的表面的投影遮挡了离视点远的表面的投影,屏幕上的绘制结果为所有可见表面最终投影的集合。

常用的消隐有两种:深度缓冲器算法深度排序算法

 

深度缓冲器算法 / Z-Buffer算法(考) ⭐⭐⭐

该算法是计算机图形学中最主要的消隐算法。!!!

算法原理

深度缓冲器算法于1974年由Catmull提出,属于图像空间消隐算法。在物空间内不对物体表面的可见性进行检测,在像空间中根据每个像素的深度值确定最终绘制的物体表面上各个像素的颜色。也称为Z-Buffer算法

 算法描述

 计算深度

若多边形的平面方程已知,一般采用增量法计算扫描线上每一像素点的深度值。

当立方体旋转到图9-65所示的位置时,六个表面都不与投影面xOy面平行,这时需要根据每个表面的平面方程计算多边形内各个像素点的深度值。

 

 

 

 用深度d初始化宽度为w、高度为h的深度缓冲器的代码如下。

void CZBuffer::InitDeepBuffer(int w,int h,double d)
//初始化深度缓冲器
{
          zBuffer=new double *[ w];
	for(int i=0;i<w;i++)
		zBuffer[i]=new double[h];
	for(int i=0;i< w;i++)
		for(int j=0;j< h;j++)
			zBuffer[i][j]=double(d); 
}

一般将物体的回转中心放置在自定义的屏幕坐标系原点,也即位于屏幕中心。为了避免深度缓冲区数组zBuffer下标的索引号为负值,二维深度缓冲区数组采用

zBuffer[xs+w/2][ys+h/2]  进行匹配。

 真实感场景中一般绘制的是物体的透视投影,在第6章中公式(6-55)仅计算了屏幕坐标系的二维坐标。

使用深度缓冲器算法绘制物体的透视图时,需要在透视变换后保留物体的深度值。

设视域四棱台的近剪切面Near远剪切面Far

9-68中,观察坐标系中从视点出发的视线会聚于视点。屏幕坐标系中,视线被映射为平行线。

 

 

 深度排序算法/画家算法

    深度排序算法是同时运用物体空间和图像空间的消隐算法

在物体空间中将表面按深度优先级排序,然后在图像空间中,由深度最大的表面开始,依次绘制各个表面。这种消隐算法通常被称为画家算法

    深度排序算法的原理是:

  • 先把屏幕置成背景色,
  • 再把物体的各个面按其离视点的远近排序形成深度优先级表,离视点远者位于表头,离视点近者位于表尾。
  • 然后按照从表头到表尾的顺序绘制各个表面,后画的表面颜色取代先画的表面颜色,相当于消除了隐藏面。

    在算法上需要构造顶点表、面表来实现。 

  

深度优先级排序算法的难点在于确定物体的深度优先级。

对于图 9-72 所示的 4 个条相互叠压(称为叠压条),每个条有一个独立的深度,而且 4 个条的深度彼此不同,则可以直接建立一个确定的深度优先级表。
对于图 9-73 4 个条相互交叉(称为交叉条),每个条至少有两个深度,不能简单地建立深度优先级表。
  1. 解决方法是

沿着图中虚线循环地分割每个条,直至最终可建立确定的深度优先级表,

  1. 另一种解决方法是

使用深度缓冲器算法直接绘制交叉条。使用深度排序算法绘制的叠压条如图9-74所示。使用深度缓冲算法绘制的交叉条如图9-75所示。

 

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

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

相关文章

Spring Bean 的生命周期

文章目录一、前言二 、Bean 的生命周期2.1 Bean 的定义信息2.2 Bean 的创建2.3 Bean 的使用2.4 Bean 的销毁2.5 循环依赖2.5.1 什么是循环依赖2.5.2 Spring 解决循环依赖2.5.2.1 三级缓存2.5.2.2 提前暴露2.5.3 注意2.5.3.1 三级缓存结构中 map 分别存储什么类型对象2.5.3.2 三…

JVM-内存与垃圾回收-1.JVM与Java体系结构

1.JVM与Java体系结构 1. JVM&#xff1a;跨语言的平台 Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大Java 也早已不再是简简单单的一门计算机语言了&#xff0c;它更是一个平台、一种文化、一个社区。 ● 作为一个平台&#xff0c;Java虚拟机扮…

机器人中的数值优化之BFGS(nonconvex and smooth)

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 wolfe conditions 2 cautious update 3 BFGS for nonconvex functions 1 wolfe conditions 当我们需要搜索方向是下降方向时&#xff0c;一定要让近似hessian的矩阵正定&#xff0c;这就需要满足wolfe条件 首先需要满…

34. 实战:基于某api实现歌曲检索与下载(附完整源代码)

目录 前言 &#xff08;相关链接在评论区&#xff09; 目的 &#xff08;相关链接在评论区&#xff09; 思路 &#xff08;相关链接在评论区&#xff09; 代码实现 1. 访问某音乐平台&#xff08;链接放在评论区了&#xff09;&#xff0c;抓包搜索接…

BUUCTF reverse题解汇总

本文是BUUCTF平台reverse题解的汇总 Page1 easyrereverse1reverse2内涵的软件新年快乐xorhelloworldreverse3不一样的flagSimpleRevJava逆向解密[GXYCTF2019]luck_guy[BJDCTF2020]JustRE刮开有奖简单注册器pyre[ACTF新生赛2020]easyrefinditrsa[ACTF新生赛2020]rome[FlareOn4]…

穿越寒冬春暖花开,当下便是在社科院杜兰金融管理硕士项目读研的好时光

时间无声的从指尖划过&#xff0c;严寒的冬天已经过去&#xff0c;春天即将到来。23考研期间&#xff0c;恰逢特殊时期&#xff0c;好多同学错失了考试的机会&#xff0c;忧心2023是否还可以读研。不要担心&#xff0c;免联考的社科院与杜兰大学金融管理硕士项目来了&#xff0…

【html】如何处理显示ttf字体图标

当看到某些文件的后缀名是ttf&#xff0c;表示是字体文件&#xff0c;除了显示字体&#xff0c;还能显示图标&#xff0c;如果需要显示的图标太多&#xff0c;就把它们放在一个文件中&#xff0c;方便统一管理图标&#xff0c;在此讲一下怎么显示字体图标。 打开文件 电脑上用…

超低损耗电路新研究:光芯片电路+量子计算

&#xff08;图片来源&#xff1a;网络&#xff09;在光通信以及使用光而不是电荷来存储和传输信息的量子计算机的设计中&#xff0c;要做到以最小的损耗传输&#xff0c;并能操纵最小单位光&#xff0c;光子起着至关重要的作用。现在&#xff0c;美国国家标准与技术研究院的研…

DynaSLAM-4 DynaSLAM中Mask R-CNN部分源码解析(Ⅲ)

目录 1.RPN 1.1 RPN层的作用与实现解读 1.2 候选框过滤ProposalLayer层 2. DetectionTargetType层 2.1 DetectionTargetType层作用 2.2 正负样本选择与标签定义 1.RPN 1.1 RPN层的作用与实现解读 上篇博客中我们解释了如何通过generate_pyramid_anchors在每一个特征层上…

Nacos学习:一、Nacos注册中心

Nacos 1. Nacos注册中心 ​ 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 ​ Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集&#xff0c;帮助您实现动态服务发…

JVM笔记(4)—— 运行时数据区——堆空间

一、堆空间内存结构 堆空间内存分为年轻代和老年代。年轻代又细分为Eden区&#xff0c;Survivor1区和Survivor2区&#xff08;又称为from区和to区&#xff09; 为什么要对堆空间进行分代&#xff1f; 因为不同对象的生命周期不同&#xff0c;绝大部分对象都是临时对象&#x…

DIY 3D打印机——【有啥用啥版】

3D打印已经非常普及&#xff0c;手搓3D打印机的也很普遍了&#xff0c;不幸的是多年前买的三角洲&#xff08;delta型&#xff09;打印机年前罢工了&#xff0c;幸好它完成了一项重要使命&#xff1a;让手搓的铣床动起来&#xff0c;从而能够让铣床把受力部分的PLA零件自己加工…

高频卡顿问题分析

从监控图中可以看到&#xff0c;3.76k的用户&#xff0c;两分钟内报卡顿次数达到100万次 &#xff0c;很恐怖&#xff0c;这个是非正常的卡顿 由于没有日志&#xff0c;只能先看代码分析&#xff0c;出现高频卡顿的原因 问题描述 在播放过程&#xff0c;会频繁上报卡顿&…

Redis详解(二)

文章目录Redis的单线程模型Redis数据过期删除策略内存淘汰机制手写LRU持久化快照持久化(RDB)RDB优缺点AOF持久化AOF优缺点RDB和AOF的选择注意事项Redis修改配置后未生效(windows)Redis的单线程模型 Redis基于Reactor模式来设计开发了自己的一套高效的时间处理模型。 Redis内部…

leetcode-每日一题-1669-合并两个链表(中等,链表操作)

这道题就是考察对链表的理解&#xff0c;但是题目给的链表和我们数据结构学的还是有点不一样的&#xff0c;这里面的头节点是带节点信息的&#xff0c;我们按照课本来说的话头节点&#xff0c;或者叫首元节点如果我记得不错的话就是叫这个&#xff0c;是不提供节点信息的&#…

[数字媒体] PR视频剪辑之自定义音频、视频加速转场和特显停顿

这篇博客是作者数字媒体系列的笔记&#xff0c;仅作为在线笔记供大家学习。在剪辑视频中&#xff0c;我们会遇到自定义音频、视频加速转场、特显停顿、画面调整等技巧&#xff0c;这篇文章将详细介绍。希望对您有所帮助&#xff0c;后续有时间会深入分享视频制作、动画制作等内…

结合淘宝与Twitter详解分布式系统与其架构设计,分布式其实并不难,阿里架构师用实战给讲明白了!

什么是分布式架构 分布式系统&#xff08;distributed system&#xff09; 是建立在网络之上的软件系统。 内聚性&#xff1a;是指每一个数据库分布节点高度自治&#xff0c;有本地的数据库管理系统。 透明性&#xff1a;是指每一个数据库分布节点对用户的应用来说都是透明的…

手把手教你如何从0到1开发自动化测试框架,你确定不看?

目录 一、序言 二、自动化测试框架技术选型 三、自动化测试框架的设计思路 四、自动化框架介绍 五、框架技术要点解析 六、后续TODO 一、序言 随着项目版本的快速迭代、APP测试有以下几个特点&#xff1a; 首先&#xff0c;功能点多且细&#xff0c;测试工作量大&#x…

Redis基本通用命令

通用命令 查看使用文档&#xff0c;例如要查看select怎么使用 help select切换数据库 select 1查看符合模板的所有key keys * keys *a keys a*判断key是否存在 exists k1给key设置有效期&#xff0c;给k1设置20秒有效期 expire k1 20查看key剩余有效期&#xff0c;查看k1…

2014年408算法题

文章目录0 结果1 题目2 思路0 结果 1 题目 2 思路 二叉树的带权路径长度&#xff08;WPL&#xff09;的计算方法有两种&#xff1a; 1&#xff0c;定义&#xff1a;WPL所有叶结点的权值Wi∗该结点深度Di求和WPL所有叶结点的权值W_i*该结点深度D_i求和WPL所有叶结点的权值Wi​…