14.曲面消隐——图像空间算法(Z-buffer)+对象空间算法(画家算法+二叉空间剖分树)
♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥
目录
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)+对象空间算法(画家算法+二叉空间剖分树)相关推荐
- 数据结构与算法—二叉排序(查找)树
目录 前言 树 二叉树 二叉排序(搜索)树 概念 构造 主要方法 findmax(),findmin() isContains(int x) insert(int x) delete(int x) 完 ...
- 排序算法之——优先队列经典实现(基于二叉堆)
许多应用都需要处理有序的元素,但有时,我们不要求所有元素都有序,或是一定要一次就将它们排序,许多情况下,我们会收集这些元素里的最大值或最小值. 这种情况下一个合适的数据结构应该支持两种操作:插入元素. ...
- 数据结构与算法——二叉平衡树(AVL树)详解
文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...
- 【数据结构与算法】之深入解析“不同的二叉搜索树”的求解思路与算法示例
一.题目要求 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数. 示例 1: 输入:n = 3 输出:5 示例 2: 输入 ...
- 《算法导论》15.5 最优二叉搜索树(含C++代码)
一.问题背景和描述 给定一个n个不同关键字的已排序的序列K=<k1,k2, - kn>(因此k1<k2<-<kn),我们希望用这 些关键字构造一棵二叉搜索树.对每个关键字 ...
- 【数据结构与算法】之深入解析“不同的二叉搜索树II”的求解思路与算法示例
一.题目要求 给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同二叉搜索树,可以按 任意顺序 返回答案. 示例 1: 输入:n = 3 输出:[[1,nul ...
- 49 - 算法 - 二叉树 - leetcode108.-将有序数组转换为二叉搜索树-中序遍历 - vector
//vec 构造函数 vec.begin() end() + num ={134} =other vector //一直到null 就行 new(int) root->left ->rig ...
- 算法导论( FFT 自动机 最优二叉搜索树 !!!)
原图链接:(!!!) 转载于:https://www.cnblogs.com/zpfbuaa/p/5099680.html
- 动态规划最优二叉搜索树C语言,【算法导论】动态规划之“最优二叉搜索树”...
详解动态规划之"最优二叉搜索树" 之前两篇分别讲了动态规划的"钢管切割"和"矩阵链乘法",感觉到了这一篇,也可以算是收官之作了.其实根据前两 ...
最新文章
- Mysql 内部结构 / Replication | 原理
- 模组使用之dB、dBm、dBw、dBu、dBc的含义和之间的关系
- golang 判断文件或文件夹是否存在
- spring中aop设计与实现
- 【Boost】boost库中智能指针——scoped_ptr
- win10 2004更新完成之后出现进不去系统的问题
- 专访刘遄:不仅仅是一名技术知识的搬运工
- Python 作为小程序后端的三种方法
- 单片机4*4矩阵键盘的原理
- html爱心表白代码(最全)
- spring批量写入mysql数据库_spring boot 向数据库写入海量数据
- 个人财务管理系统设计与实现
- 多个无线WIFI路由器之间实现不掉线无缝切换的设置方法
- 蒙特卡洛积分 matlab,菜鸟之路——数学建模之蒙特卡罗积分(投点法,平均值法)+牛顿法解方程组MATLAB实现...
- 论文摘要怎么写——分享5个较好的摘要
- PFO(DMP end capped) cas:195456-48-5聚合物光电材料
- 深度学习之PyTorch——Deep NN实现手写MNIST数字分类
- C语言求任意四边形面积和其关联的三角形面积的关系
- 小实战项目之——吃货联盟订餐系统
- 北京大学计算机学院保研名单,北京大学2011年保研名单汇总