♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥

目录

1.曲面消隐

2.曲面消隐算法——图像空间算法

3.曲面消隐算法——对象空间算法

♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥

1.曲面消隐

消除隐藏的曲面。

原图:

此时很难判断物体之间的位置关系。

消除隐藏的线和面:

对于曲面消隐算法,根据消隐空间可以分为两种:

  • 图像空间消隐
  • 景物空间消隐/对象空间消隐

2.曲面消隐算法——图像空间算法

图像空间消隐是在图像坐标系进行设备变换(已经完成了投影变换,已经从三维转换为了二维)时的消隐。是二维坐标系下的消隐。

图像空间算法的特点为:

  • 受分辨率限制
  • 算法复杂为O(nN),n是多边形的数目(图元的数目),N是像素的数量

常用的算法有Z-buffer、扫描线算法。

(1)Z-buffer

Z-buffer算法,称为Z缓冲算法,即存储了Z轴的深度信息。选择离视点最近的点将其绘制。

投影面为z=0,投影类型为平行投影。

举例:

紫色的三角形为第一个多边形,它是一个深度均匀的图形,深度均为5.

橘色的多边形为第二个多边形,它的深度是不均匀的,在第一个多边形的基础上,更新颜色信息。

如果某个像素点已经是紫色了,但是橘黄色多边形离视点更近,则将其用橘黄色多边形替换。如果橘黄色多边形离视点更远,则该点的颜色不变。

如果某个像素点还没有颜色,则将其绘制为橘黄色。

可以看出,Z-buffer算法的思想为:选择离视点最近的点进行绘制。

其算法流程为:

z_buffer_init()//初始化

{

对所有的像素点遍历进行初始化;

{

将所有的像素点绘制为背景色;

将所有像素点的z值初始化为正无穷

}

}

z_buffer_draw()

{

从第一个多边形开始遍历,到最后一个多边形

{

对该多边形的每个像素进行遍历

{

如果该像素的Z值小于画布对应位置的像素的Z轴,

则将画布上该位置的Z值更新,同时更新颜色值。

}

}

}

注意:如果Z值是非正数,即负数和0,则在初始化的时候Z值应该是负无穷,然后取Z值最大的值。即总是取离视点最近的Z值。

Z_buffer算法的优缺点

  • 计算复杂度为O(nN),双重循环进行遍历
  • 优:不需要排序
  • 优:对多边形的几何形状没有限制,几何形状可以是任意的
  • 硬件加速
  • 缺:占显存
  • 缺:容易走样
  • 缺:不好处理透明物体

(2)扫描线算法

3.曲面消隐算法——对象空间算法

对象空间消隐是在视点坐标系进行投影变换时的消隐。

对象空间算法的特点为:

  • 适合于精密的CAD工程领域
  • 算法复杂度为O(n^2),n是物体的数目。

常用算法为向后面剔除(back face culling )、列表优先级算法(list priority methods)。

3.1 向后面剔除

如上图,是向后面剔除算法的示意图。

V:从物体到摄像机(视点)的视线方向。

N:物体表面的垂直方向。

:该物体是不可见的。

:该物体是可见的。

算法的不足:

  • 仅限于凸多面体。
  • 不能处理遮挡的物体。

3.2 列表优先级算法

原理:离视点远的物体不会遮挡离视点近的物体。

关键:确定景物空间中物体的可见性顺序。

条件:场景中物体在Z方向上没有相互重叠。

深度排序算法

这里采用画家算法,也被称为优先填充算法。

如图是画家算法的示意图。

画家算法的主要思想是,先绘制距离较远的场景,然后用距离较近的场景替代距离较远的场景。

如上图,可以看出多边形P的Zmax小于多边形Q的Zmin,则表明多边形Q更加接近视点(沿着Z轴负方向观察)。

则应该先画P,后画Q。

但是上图中,不同多边形的Z值范围是不重叠的,如果物体间的Z值范围是重叠的,则还需要判断多边形P是否遮挡多边形Q。

需要做以下5个判别步骤:

(1)多边形P和Q的x坐标范围是否不重叠。

(2)多边形P和Q的y坐标范围是否不重叠。

(3)从视点上看,多边形P是否完全位于多边形Q的背面。

(4)从视点上看,多边形Q是否完全位于P的同一侧。

(5)多边形P和Q在xy平面上的投影是否不重叠。

上述五种情况只要有一种成立,则表明多边形P和Q是互相不遮挡的(如下图,物体是互相遮挡的)。则多边形P的绘制优先级低于Q。

如果仍旧无法判断其优先级顺序,则要对物体做多边形剖分。

二叉空间剖分树算法(BSP树)

二叉空间剖分树算法的思想是:如果场景中多边形可以被一个平面分割成两部分,则与视点同侧的物体不会被异侧物体遮挡。

之后对位于分割平面两侧的多边形继续进行递归分割,直到每一个分割平面两侧或者一侧只有一个多边形。

可以看二叉空间剖分算法可以用一个二叉树的数据结构来表示。

举例:

空间ABC由A、B、C三个独立的房间组成,首先,分割平面1将空间分成了平面正向的A房间和平面负向的BC空间,BC空间被2紧接着分割为平面2正向的C房间和负向的B房间。注意这里平面的方向一般由墙壁面向的方向而定。

另一个实例:

上图是为了说明二叉空间剖分树不是唯一的。

BSP树的遍历:

视点位于分割平面的正侧,则遍历顺序为:负侧分支->根节点多边形->正侧分支

视点位于分割平面的负侧,则遍历顺序为:正侧分支->根节点多边形->负侧分支

3.3 常见的消隐算法

  • Back-Face Detection
  • Painter's Algorithm
  • Ray Casting
  • Scan-Line
  • Z-Buffer
  • Area Subvision

Click 下一篇文章:15.真实感图形——光照与明暗+光线跟踪+纹理映射+辐射度方法+阴影

♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥

广告时间:

本宝宝开通了一个公众号,记录日常的深度学习和强化学习笔记。

希望大家可以共同进步,嘻嘻嘻!

求关注,爱你呦!

14.曲面消隐——图像空间算法(Z-buffer)+对象空间算法(画家算法+二叉空间剖分树)相关推荐

  1. 数据结构与算法—二叉排序(查找)树

    目录 前言 树 二叉树 二叉排序(搜索)树 概念 构造 主要方法 findmax(),findmin() isContains(int x) insert(int x) delete(int x) 完 ...

  2. 排序算法之——优先队列经典实现(基于二叉堆)

    许多应用都需要处理有序的元素,但有时,我们不要求所有元素都有序,或是一定要一次就将它们排序,许多情况下,我们会收集这些元素里的最大值或最小值. 这种情况下一个合适的数据结构应该支持两种操作:插入元素. ...

  3. 数据结构与算法——二叉平衡树(AVL树)详解

    文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...

  4. 【数据结构与算法】之深入解析“不同的二叉搜索树”的求解思路与算法示例

    一.题目要求 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数. 示例 1: 输入:n = 3 输出:5 示例 2: 输入 ...

  5. 《算法导论》15.5 最优二叉搜索树(含C++代码)

    一.问题背景和描述 给定一个n个不同关键字的已排序的序列K=<k1,k2, - kn>(因此k1<k2<-<kn),我们希望用这 些关键字构造一棵二叉搜索树.对每个关键字 ...

  6. 【数据结构与算法】之深入解析“不同的二叉搜索树II”的求解思路与算法示例

    一.题目要求 给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同二叉搜索树,可以按 任意顺序 返回答案. 示例 1: 输入:n = 3 输出:[[1,nul ...

  7. 49 - 算法 - 二叉树 - leetcode108.-将有序数组转换为二叉搜索树-中序遍历 - vector

    //vec 构造函数 vec.begin() end() + num ={134} =other vector //一直到null 就行 new(int) root->left ->rig ...

  8. 算法导论( FFT 自动机 最优二叉搜索树 !!!)

    原图链接:(!!!) 转载于:https://www.cnblogs.com/zpfbuaa/p/5099680.html

  9. 动态规划最优二叉搜索树C语言,【算法导论】动态规划之“最优二叉搜索树”...

    详解动态规划之"最优二叉搜索树" 之前两篇分别讲了动态规划的"钢管切割"和"矩阵链乘法",感觉到了这一篇,也可以算是收官之作了.其实根据前两 ...

最新文章

  1. Mysql 内部结构 / Replication | 原理
  2. 模组使用之dB、dBm、dBw、dBu、dBc的含义和之间的关系
  3. golang 判断文件或文件夹是否存在
  4. spring中aop设计与实现
  5. 【Boost】boost库中智能指针——scoped_ptr
  6. win10 2004更新完成之后出现进不去系统的问题
  7. 专访刘遄:不仅仅是一名技术知识的搬运工
  8. Python 作为小程序后端的三种方法
  9. 单片机4*4矩阵键盘的原理
  10. html爱心表白代码(最全)
  11. spring批量写入mysql数据库_spring boot 向数据库写入海量数据
  12. 个人财务管理系统设计与实现
  13. 多个无线WIFI路由器之间实现不掉线无缝切换的设置方法
  14. 蒙特卡洛积分 matlab,菜鸟之路——数学建模之蒙特卡罗积分(投点法,平均值法)+牛顿法解方程组MATLAB实现...
  15. 论文摘要怎么写——分享5个较好的摘要
  16. PFO(DMP end capped) cas:195456-48-5聚合物光电材料
  17. 深度学习之PyTorch——Deep NN实现手写MNIST数字分类
  18. C语言求任意四边形面积和其关联的三角形面积的关系
  19. 小实战项目之——吃货联盟订餐系统
  20. 北京大学计算机学院保研名单,北京大学2011年保研名单汇总

热门文章

  1. Vue.js实战第十章笔记
  2. 接口测试用例设计方法方式和流程一文到底
  3. CRC循环冗余校验是如何纠错的
  4. 驼峰命名法与下划线命名法之争
  5. AcceptEx函数特点及需要提防的地方,看完了解更深入了,所以转过来
  6. 程序员群嘲红芯浏览器:注释过度很业余,创新混淆视听
  7. Python调用PHP的函数
  8. LDA主题模型1——数学基础
  9. spark sql 之 collect_set collect_list 后WrappedArray 取值
  10. 大众点评列表页采集思路,破解字体文件反爬(包含项目github 可用时间至2020-01-21)