♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥
♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥
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
♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥
广告时间:
本宝宝开通了一个公众号,记录日常的深度学习和强化学习笔记。
希望大家可以共同进步,嘻嘻嘻!
求关注,爱你呦!