视锥体裁剪几何算法研究
屏幕空间背面剔除算法原理

屏幕空间背面剔除算法原理屏幕空间背面剔除算法(Screen-Space Culling)是一种图形学中的优化算法,它可以减少渲染时的冗余工作,从而提高渲染效率和性能。
该算法通过判断物体是否在相机的视锥体内,从而将在视锥体外的物体剔除掉,只对需要渲染的物体进行处理。
本文将介绍屏幕空间背面剔除算法的实现原理和应用场景。
一、视锥体的概念视锥体(Frustum)是一种锥形的几何体,它是用来描述相机视野的几何体。
在三维空间中,视锥体通常以相机位置为顶点,视野范围对应的视锥面作为底部,构成一个几何体。
视锥体的形状和大小取决于相机的参数设置,包括相机的视角、宽高比、远近裁剪面等。
视锥体是进行屏幕空间背面剔除的核心概念,其可以用来快速判断物体是否在相机的视野范围内,并将位于视锥体外部的物体剔除掉。
屏幕空间背面剔除算法的原理是将物体的顶点从世界坐标系转换到相机坐标系下,然后再将其投影到屏幕空间坐标系中(即2D平面上),最后进行视锥裁剪操作,只保留相机视锥体内的物体。
具体来说,该算法的实现步骤如下:1.将物体的顶点从世界坐标系转换到相机坐标系下,通过以下公式进行计算:$$ v_c = M_{view} * v_w $$其中,$v_w$是物体的世界坐标系下的顶点,$M_{view}$是相机变换矩阵,$v_c$是物体在相机坐标系下的顶点坐标。
其中,$M_{projection}$是投影矩阵,$v_p$是物体在屏幕空间下的顶点坐标,这里一般使用透视投影将三维物体投影到二维屏幕上。
3.在屏幕空间中,对物体进行视锥裁剪操作,只保留位于视锥体内部的部分。
具体来说,对于在屏幕空间下的顶点坐标 $(x, y, z)$,如果它满足以下关系:$$ -1 \leq x, y, z \leq 1 $$则该顶点在视锥体内,否则该顶点在视锥体外,需要剔除掉。
通过以上步骤,可以快速将相机视锥体外的物体剔除掉,只对需要渲染的物体进行处理,从而提高渲染效率和性能。
3D中视锥的剪裁共7页文档

3D中视锥的剪裁3D游戏制作中游戏的速度至关重要,玩家是没有耐心去玩画面停顿的游戏,对游戏来说30帧/秒的速度已经能够运行,60帧/秒是比较合适的。
当然帧速率越高,游戏的画面就越流畅,游戏的效果就越出众。
3D中提高游戏的帧速率的一个有效的办法就是把我们视野范围以外的物体不渲染出来也就是我们通常所讲的视锥的剪裁(View Frustum Culling)。
比如CS 中某个时刻视野范围中的场景和一张完整地图,3D加载模型的时候是需要把整个地图的场景全部加载进去,其实在游戏某一时刻视野范围内只能看到的是非常小的一部分。
如果不把看不见的部分剪裁掉就导致极大的资源浪费,直接影响游戏的帧速率。
如果要进行剪裁首先要判断哪些物体能看得见,哪些物体看不见,由3D的基本知识可知,所谓看得见的物体就在游戏中虚拟摄影机所确定的视锥范围以内或与视锥相交的物体,如下图所示: 图1 视锥的范围图2 视锥的剪裁由上图可以看出要做视锥裁减先要计算出构成视锥的六个面的平面方程,然后在判断物体是否与六个平面的相交。
下面我们来推导一下视锥的六个面的平面方程,假设世界坐标系有一点V它经过视图转换和透视投影转换后为V',假设中的转换矩阵为M,推导过程如下:v=(x y z w=1) M=(mü) v′=(x′ y′ z′ w′)根据3D的基础知识可知,如果V在“未转换”视锥范围之内,那么V'也一定在视锥范围之内。
V在视锥范围之内的条件是下面不等式的成立: ?Cw′ GetTransform(D3DTS_VIEW, &ViewMatrix);pDevice->GetTransform(D3DTS_PROJECTION, &ProjectionMatrix);D3DXMatrixMultiply(&Matrix, &ViewMatrix,&ProjectionMatrix);m_Planes[0].a = Matrix._14 + Matrix._13;m_Planes[0].b = Matrix._24 + Matrix._23;m_Planes[0].c = Matrix._34 + Matrix._33;m_Planes[0].d = Matrix._44 + Matrix._43;D3DXPlaneNormalize(&m_Planes[0], &m_Planes[0]);m_Planes[1].a = Matrix._14 - Matrix._13;m_Planes[1].b = Matrix._24 - Matrix._23;m_Planes[1].c = Matrix._34 - Matrix._33;m_Planes[1].d = Matrix._44 - Matrix._43;D3DXPlaneNormalize(&m_Planes[1], &m_Planes[1]);m_Planes[2].a = Matrix._14 + Matrix._11;m_Planes[2].b = Matrix._24 + Matrix._21;m_Planes[2].c = Matrix._34 + Matrix._31;m_Planes[2].d = Matrix._44 + Matrix._41;D3DXPlaneNormalize(&m_Planes[2], &m_Planes[2]);m_Planes[3].a = Matrix._14 - Matrix._11;m_Planes[3].b = Matrix._24 - Matrix._21;m_Planes[3].c = Matrix._34 - Matrix._31;m_Planes[3].d = Matrix._44 - Matrix._41;D3DXPlaneNormalize(&m_Planes[3], &m_Planes[3]);m_Planes[4].a = Matrix._14 - Matrix._12;m_Planes[4].b = Matrix._24 - Matrix._22;m_Planes[4].c = Matrix._34 - Matrix._32;m_Planes[4].d = Matrix._44 - Matrix._42;D3DXPlaneNormalize(&m_Planes[4], &m_Planes[4]);m_Planes[5].a = Matrix._14 + Matrix._12;m_Planes[5].b = Matrix._24 + Matrix._22;m_Planes[5].c = Matrix._34 + Matrix._32;m_Planes[5].d = Matrix._44 + Matrix._42;D3DXPlaneNormalize(&m_Planes[5], &m_Planes[5]);}CFrustum::~CFrustum(void)bool CFrustum::TestPoint(FLOAT XPOS, FLOAT YPOS, FLOAT ZPOS) { for(short Counter = 0; Counter = 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + Size, YCentre - Size, ZCentre - Size)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre - Size, YCentre + Size, ZCentre - Size)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + Size, YCentre + Size, ZCentre - Size)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre - Size, YCentre - Size, ZCentre + Size)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + Size, YCentre - Size, ZCentre + Size)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre - Size, YCentre + Size, ZCentre + Size)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + Size, YCentre + Size, ZCentre + Size)) >= 0.0f)continue;return false;} return true;}bool CFrustum::TestRectangle(float XCentre, float YCentre, float ZCentre,float XSize, float YSize, float ZSize){ for(short Counter = 0; Counter = 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + XSize, YCentre - YSize, ZCentre - ZSize)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre - XSize, YCentre + YSize, ZCentre - ZSize)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + XSize, YCentre + YSize, ZCentre - ZSize)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre - XSize, YCentre - YSize, ZCentre + ZSize)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + XSize, YCentre - YSize, ZCentre + ZSize)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre - XSize, YCentre + YSize, ZCentre + ZSize)) >= 0.0f)continue;if(D3DXPlaneDotCoord(&m_Planes[Counter],&D3DXVECTOR3(XCentre + XSize, YCentre + YSize, ZCentre + ZSize)) >= 0.0f)continue;return false;} return true; }bool CFrustum::TestSphere(float XCentre, float YCentre, float ZCentre, float Radius){ for(short Counter = 0; Counter GetNumVertices();DWORD FVF = pMesh->GetFVF();UINT FVFSize = D3DXGetFVFVertexSize(FVF);LPVOID ppData = NULL;//锁定mesh中的顶点缓冲区pMesh->LockVertexBuffer(D3DLOCK_READONLY, &ppData);if(ppData){ D3DXVECTOR3 Centre(0,0,0);FLOAT Radius = 0;//计算出mesh的包围球D3DXComputeBoundingSphere((D3DXVECTOR3*)ppData, NumVertices,FVFSize, &Centre, &Radius);if(TestSphere(Centre.x, Centre.y, Centre.z, Radius)){ pMesh->UnlockVertexBuffer();return true;pMesh->UnlockVertexBuffer(); //解锁顶点缓冲区}return false;2 结束语上面只是对视锥的裁剪基本方法进行了分析,真实在大型3D场景中进行视锥的裁剪还需要借助四叉数这种数据结构来进行管理裁剪,这样才能达到真正意思上的提高效率。
ue4 视锥剔除算法

ue4 视锥剔除算法
视锥剔除算法(View Frustum Culling)是一种用于优化计算机图形渲染的技术,它能够在渲染前快速排除视锥(或视景体)外的物体,从而减少不必要的渲染计算,提高渲染效率。
UE4中使用的视锥剔除算法是基于视锥截剖体进行计算的。
视锥(Frustum)是一个具有近裁剪面、远裁剪面和多个侧面的截剖体,它定义了渲染相机可见的区域。
UE4的视锥剔除算法一般包括以下步骤:
1. 构建视锥截剖体:根据相机的位置、朝向和视场角,计算近裁剪面、远裁剪面和侧面的顶点坐标。
2. 提取可见物体:对于场景中的每个物体,通过判断它的边界框(例如包围盒或包围球)是否与视锥相交来确定是否可见。
如果边界框与视锥不相交,则物体被剔除;否则,物体被添加到可见物体列表中。
3. 渲染可见物体:对于可见物体列表中的每个物体,使用相应的渲染技术进行渲染,例如物体空间光照、阴影投射等。
通过对不可见物体的剔除,可以减少渲染计算的数量,从而提高渲染性能。
这对
于需要渲染大量物体的实时应用程序非常重要。
cesium合并算法 -回复

cesium合并算法-回复标题:深入理解与应用Cesium合并算法Cesium,作为一个强大的开源三维地球和地图可视化库,其在地理信息处理、空间数据分析以及三维场景构建等方面具有广泛的应用。
其中,Cesium的合并算法是其核心功能之一,主要用于处理和优化大规模三维地理数据的加载和显示。
本文将详细解析Cesium的合并算法,以帮助读者深入理解并有效应用这一关键技术。
一、理解Cesium合并算法的背景和需求在处理大规模三维地理数据时,通常会面临数据量大、复杂度高、加载和渲染效率低等问题。
为了解决这些问题,Cesium引入了合并算法。
该算法的主要目标是通过合理的数据组织和优化,提高数据加载速度和渲染性能,同时保证三维场景的视觉效果和用户体验。
二、Cesium合并算法的基本原理1. 数据分块:Cesium的合并算法首先将大规模三维地理数据进行分块处理。
这种分块策略基于空间索引结构,如四叉树或八叉树,将数据按照地理位置和层次关系进行划分。
这样,可以将大数据集分解为多个小的数据块,每个数据块包含一定范围内的地理特征。
2. 数据压缩:在分块的基础上,Cesium进一步对数据进行压缩处理。
这包括几何形状的简化、纹理的压缩以及其他相关的优化技术。
通过数据压缩,可以显著减小数据的存储和传输开销,提高数据处理效率。
3. 数据合并:Cesium的合并算法的核心是对分块后的数据进行合并处理。
在实际应用中,由于视点和视角的变化,用户可能只需要查看局部区域的三维数据。
因此,Cesium通过动态合并算法,根据用户的视锥体和当前的观察位置,只加载和合并可视范围内的重要数据块,而忽略其他非关键区域的数据。
三、Cesium合并算法的实现步骤以下是一个简化的Cesium合并算法实现步骤:1. 数据预处理:首先,对原始的三维地理数据进行清洗和格式转换,使其符合Cesium的数据模型和格式要求。
2. 空间索引构建:利用四叉树或八叉树等空间索引结构,将数据划分为多个小的数据块。
三维渲染中的裁剪总汇

三维渲染中的裁剪总汇
裁剪是个很大的概念,裁剪包括了视锥体裁剪(应用程序阶段)、视口裁剪(图元装配——几何阶段的最后一步)、背面剔除(光栅化阶段)、遮挡剔除(光栅化阶段)。
1.视锥体裁剪
视锥裁剪算法是在应用程序阶段执行的。
虚拟摄像机制定了场景对观察者可见的部分,即我们将依据哪部分3D场景来创建2D图像。
2. 视口裁剪
几何阶段处理结束后,送到光栅化阶段的是一堆三角形面片,所以中几何阶段中需要对顶点进行图元装配。
所谓的图元装配,即根据顶点原始的连接关系,还原出模型的网格结构。
网格由顶点和索引组成,在之前的流水线中是对顶点的处理,而在这阶段是根据索引将顶点连接中一起,组成线、面单元。
然后对超出视口外的三角形进行裁剪(视口裁剪)。
3.背面剔除(光栅化阶段)
渲染的对象都是三角面,有相机,就是有正面和反面。
正面可以被看见,反面看不见,就需要渲染,就叫背面剔除。
4.遮挡裁剪
在cry引擎中的遮挡算法,使用的是软件光栅化,大致流程就是,在编辑器中放置一些正交的长方体作为遮挡体,在渲染时,每帧都在CPU上面光栅化这些遮挡体(当然是在分辨率比较小的渲染目标上进行),然后对远处物体进行查询。
现代GPU中运用了Early-Z的技术,在Vertex阶段和Fragment阶段之间(光栅化之后,fragment之前)进行一次深度测试,如果深度测试失败,就不必进行fragment阶段的计算了,因此在性能上会有很大的提升。
但是最终的ZTest仍然需要进行,以保证最终的遮挡关系结果正确。
二、遮挡剔除的方法
1. 传统的PVS光线投射子划分。
视锥体的名词解释

视锥体的名词解释视锥体是指在几何光学中,由象限、垂线和轴线组成的一个几何体。
在摄影和计算机图形学中,视锥体用于表示在一个三维空间中可见的物体范围。
视锥体的概念可直接联系到人眼视觉的原理,同时也是研究虚拟现实、计算机游戏和动画等领域中的基础概念。
视锥体的形状类似于一个圆锥,其中顶点是眼睛或相机的位置,底面是一个二维平面,被称为近裁剪面。
视锥体沿着轴线向前延伸,形成一个无限远的锥形空间。
这个锥形空间内的物体都可以被眼睛或相机捕捉到,而在视锥体之外的物体则无法看到。
视锥体的近裁剪面是一个与相机平行的平面,表示在视锥体内的物体在屏幕上可见的部分。
远裁剪面则定义了视锥体的最远可见范围,超出此范围的物体将无法显示在屏幕上。
视锥体的侧面是两个由远裁剪面连接到近裁剪面的锥形体积,称为可视体积。
可视体积内的物体视觉上完整显示在屏幕上,而视锥体之外的物体则被裁剪掉或不可见。
视锥体的定义对于计算机图形学和虚拟现实中的视景体(culling)和隐藏面消除(hidden surface removal)等算法起着重要作用。
视锥体剔除(视景体剔除)是一种用于优化图形渲染性能的技术,它通过判断物体是否在视锥体范围内来决定是否渲染该物体。
只有当一个物体完全或部分位于视锥体内时,才需要进行渲染;若物体完全位于视锥体外,可直接剔除,从而提高渲染速度和降低计算负担。
在虚拟现实和游戏开发中,视锥体还用于裁剪不可见物体,即隐藏面消除。
通过将视锥体与场景中的物体进行相交测试,能够判断出哪些物体被其他物体遮挡,从而只渲染可见的部分。
这种技术可以大幅提高图形渲染效率,使得虚拟现实和游戏中的场景更加真实和自然。
另外,视锥体还有助于定义相机的工作范围和透视效果。
相机的位置和视锥体的参数可以决定拍摄画面的大小、焦距、景深等因素。
这对摄影师和电影导演来说具有重要意义,因为它影响着视觉作品所传达的视角和观感。
总而言之,视锥体是一种用于表示在三维空间中可见物体范围的几何体。
圆锥的切割与投影问题研究

圆锥的切割与投影问题研究一、引言圆锥作为一种常见的几何体,在各个领域都有广泛的应用。
而对于圆锥的切割与投影问题的研究,则是探索圆锥几何性质和应用的重要方向之一。
本文将对圆锥的切割与投影问题进行深入研究,旨在揭示圆锥的相关特性,拓展其应用领域。
二、圆锥的切割问题研究1. 圆锥的切割基本概念在研究圆锥的切割问题之前,我们首先需要理解圆锥的基本概念。
圆锥是一种由顶点、轴线和底面组成的几何体,其底面为一个圆,顶点位于轴线的另一端。
通过不同的切割方式,我们可以改变圆锥的形状和特性。
2. 圆锥的切割方式圆锥的切割方式多种多样,其中较为常见的有平行切割、斜切割和垂直切割。
通过这些切割方式,我们可以得到不同形状和尺寸的切割体,进而应用于各个领域。
3. 圆锥切割的应用案例圆锥的切割在实际应用中有许多案例。
以工程建筑中的水泥管道为例,通过对圆锥进行斜切割,可以得到一种更符合实际需求的形状,提高了管道的连接性和稳定性。
类似地,在制造轮胎、建造锥形烟囱等领域也能看到圆锥切割的应用。
三、圆锥的投影问题研究1. 圆锥的投影基本概念与切割问题相似,理解圆锥的投影问题也是研究的基础。
投影是一种将三维物体映射到二维平面上的方法,通过投影,我们可以观察到物体在不同角度下的形状和特性。
2. 圆锥的投影方式圆锥的投影方式主要有平行投影和透视投影两种。
平行投影是指物体在平行光线的照射下的投影效果,透视投影则是指物体在采用透视原理的光线照射下的投影效果。
这两种投影方式都具有独特的特性和应用场景。
3. 圆锥投影的应用案例圆锥的投影在各个领域都有广泛的应用。
在建筑设计中,通过投影可以帮助设计师更清晰地了解建筑物在不同角度下的外观,提高设计的精确性和美观性。
此外,在电影制作、虚拟现实等领域,圆锥的投影也被广泛应用。
四、结论通过对圆锥的切割与投影问题进行研究,我们可以深入了解圆锥的特性和应用场景。
圆锥的切割可以改变其形状和尺寸,应用于各个领域的实际问题;圆锥的投影则可以帮助我们观察物体在不同角度下的形状和特性。
基于3DS室内模型虚拟漫游场景的管理方法

6文章编号:1007-757X(2011)09-0060-03基于3DS 室内模型虚拟漫游场景的管理方法袁永美摘要:以3DS 室内模型作为虚拟漫游场景,提出了一种基于Portal 技术的入口生成新方法及视锥体裁剪算法。
首先在3DS MAX 建模时确定入口位置,然后在虚拟漫游时由入口位置计算生成入口平面,进而用入口平面裁剪视锥体创建物体可见集实现场景管理。
实验结果表明,这种入口生成方法效率高,室内模型遮挡性越强,裁剪算法的优越性越突出,此方法可适用于任何3DS 室内模型虚拟漫游的场景管理。
关键词:虚拟漫游;3DS 室内模型;Portal 技术;入口平面;视锥体裁剪中图分类号:TP391.9文献标志码:A0引言虚拟室内漫游,是计算机图形学与虚拟现实领域研究的经典问题之一,虚拟建筑室内漫游技术,已成为房地产宣传销售的重要手段。
虚拟场景管理技术对虚拟室内漫游至关重要,国内外同行在上述问题领域,进行了大量研究和实践,提出了许多方法和算法。
笔者对一个三室两厅的室内模型(包括超过50个对象,90万个多边形,54万个顶点)实现了虚拟漫游效果,基于前人研究Portal (入口)技术[1]的基础上,将入口位置的查找和计算工作在3DS 模型中实现,提高了场景管理的实效性,并在实际应用中取得了良好效果。
1室内场景的建模3DS MAX 系统单位的1毫米对应OpenGL 中的一个单位。
用3DS MAX 软件制作模型,导出为3DS 文件,再通过OpenGL 实现对3DS 文件的读取,是虚拟现实技术中构建模型的一种重要方式。
把贴图文件和3DS 文件放到VC++工程目录下可以再现3DS MAX 贴图效果。
本文以三室两厅室内模型作为漫游实例,CAD 平面布置图,如图1所示:图1CAD 平面将CAD 图纸导入3DS MAX 中,用画线工具沿着墙体内部画线,二维封闭线形拉伸为三维物体,使用Edit Poly(编辑多边形)命令将实体法线翻转形成室内空间。
视锥体裁剪几何算法研究

视锥体裁剪几何算法研究于海燕;张帅;余沛文;何援军【摘要】From the point of view of geometry, a view frustum culling geometric algorithm is designed based on projective theory in descriptive geometry. The basic idea is that a proper computational coordinate system is built, where the space position relation of the view frustum and a line segment is transformed into the plane position relation of a trapezoid and the line segment by simple orthographic projection. This geometric dimension reduction method is beneficial to solve space geometric singular issue. A test sample is designed which includes all kinds of typical position relations of the view frustum and the line segment to comprehensively evaluate algorithm's speed and stability. And especially, there are 78 kinds of geometric singular relations. At last, our view frustum culling geometric algorithm, classical Liang-Barsky algorithm and a basic algorithm to solvethe problem of intersection with 6 planes have been implemented on Visual C++ with C program. On the basement of qualitative analysis, these 3 algorithms have been tested on speed and stability.%从几何角度出发,以投影理论为指导,设计了一种降维投影的视锥体裁剪几何算法.基本思想是基于视锥体构建计算坐标系,在计算坐标系下,向两个投影平面做正投影.空间中被裁剪线段与视锥体的位置关系被简化为投影平面内线段与等腰梯形的关系.这种几何化的降维方法有利于解决空间几何奇异问题.构建了空间视锥体裁剪中线段与视锥体的各种位置关系的测试样本,特别是78种处于几何奇异状态的位置关系,用于综合评估算法的速度和稳定性.用C语言在VC++平台上分别实现了投影降维的视锥体裁剪几何算法、经典的Liang-Barsky算法和与6个面分别求交的一般算法.在定性分析基础上,利用测试样本对3种算法做了计算速度与稳定性方面的测试对比.【期刊名称】《图学学报》【年(卷),期】2017(038)001【总页数】4页(P1-4)【关键词】视锥体裁剪;几何算法;投影理论;几何奇异【作者】于海燕;张帅;余沛文;何援军【作者单位】东华大学机械工程学院,上海 201620;东华大学机械工程学院,上海201620;东华大学机械工程学院,上海 201620;上海交通大学计算机系,上海200240【正文语种】中文【中图分类】TP391.72随着三维几何模型愈发复杂、逼真,虚拟环境的场景规模越来越大,如何有效减少绘制对象,降低三维模型的复杂度,是三维显示系统中快速稳定绘制复杂场景的关键所在。
unity3D学习之视锥体

了解视锥体视锥体(frustum) 指看起来类似于金字塔的立方体形状,切去顶部,顶部与底部平行。
这是一个透视相机可以看到和渲染的区域形状。
下列思维实验对此进行了解释。
想象自己拿着一根直杆(比如扫帚手柄或铅笔),一端对着相机,照一张相。
如果直杆出现在照片中心,与摄像头垂直,那么只有对着相机的这一端可见,在照片中显示为一个圆,其他部分都被遮住。
如果向上移动直杆,其下方开始显现出来,但向上调整直杆的角度后又隐藏起来了。
如果继续向上移动直杆并将角度调到更大,圆形端最终会到达照片的顶部边缘。
此时,世界空间中直杆描绘的这条线以上的任何物体都不会出现在照片中。
可轻松移动,左右或随意水平及垂直旋转直杆。
“隐藏”直杆的角度只取决于其到屏幕中心两个轴的距离。
文章来自【狗刨学习网】该思维实验所表达的意思是相机影像中的任意点真正对应世界坐标空间中的一条线,而影像中只有这条线上的一个点可见。
这条线上除该点以外的所有物体都被遮盖。
图像外缘由对应图像各个角的偏离线定义。
如果朝着相机向后描绘这些线,最终会集中于一点。
在Unity 中,该点正位于相机的转换位置,被称为视图中心。
在视图中心,屏幕顶部中心和底部中心汇聚的直线夹角被称为视野(通常简写为FOV)。
如上所述,任何超出图像边缘偏离线外的事物在相机中都不可见,但对于其渲染的对象也有两个其他限制条件。
近裁剪面和远裁剪面与相机的XY 平面平行,都与中心线有一定距离。
比近裁剪面更靠近相机的任何物体和比远裁剪面更远的物体都不会被渲染。
图像偏离线夹角与两个裁剪面定义一个截棱锥,即视锥体。
场景视锥裁剪算法的再优化

1 空间相关性
空间相关性是指在下层景物检查时 , 利用上层 景物的检查信息. 以使用以下两种空间相关性 : 可 ① 当上层景物位 于视锥 内时, 下层景物必位
将靠近在一起的多个景物组合成一个新的景物 , 当 该景物被剔 除时, 它所包含 的多个景物一起 被剔 除. 因为视景数据库 中的大部分景物在视锥外 , 这 种作法的效率非常高 . 组合景物的过程可以从小 到 大逐级嵌套进行 . 组合景物的过程导致建模稍微 复
维普资讯
第2 4卷 第 2期 20 年 o 月 06 4
佳 木 斯 大 学 学 报 (自 然 科 学 版 )
Junl f i ui n e i N t a S i c d i ) ora o a s U i rt a r c n E io J m v sy( u l e e t n
100 ) 50 1
摘 要: 在“ T R G三雏图形开发工具 包” 开发工作的基础上 , 借助计算机图形学视锥裁剪算法的基本 原理 , 了进一步的技术优化 , 出了针对视锥的粗裁剪和精裁剪方法, 而大幅度的提 高了大场景 中视 做 提 进
野 内的绘 制 渲染速度 , 为开发 大型 实时场景提 供 了 良好 的前提 条件 .
第2 期
范文姬 , 场景视锥裁剪算法的再优化 等: 位于圆锥外部 . 易知 :
17 9
检查景物与平截六面体的关系时, 仅使用景物 的包围盒 , 不涉及景物的面 . 景物 的包 围盒采用两 种, 粗包围盒为包含景物的最小包 围球 , 细包 围盒
为包含景物的最小轴向长方体 . 包围球使用球心和
过程部分转换为搜索过程 , 大大减少处理景物 的数 景物要被剔除, 不予处理 .
cesium 计算视锥体面

cesium 计算视锥体面
Cesium是一个用于创建虚拟地球和地理空间数据可视化的开源JavaScript库。
它可以用于创建三维地球和地理空间场景,并支持视锥体计算以确定场景中可见的区域。
视锥体是指从观察者(相机或眼睛)位置开始向外延伸的一个锥形区域,它决定了观察者能够看到的场景范围。
在Cesium中,视锥体面的计算涉及到确定相机的位置、方向、视野角度等参数,以及场景中的物体位置和大小。
Cesium库通过内置的视锥体计算功能来确定相机位置下可见的区域,并在渲染中只显示这部分区域的内容,从而提高渲染效率。
视锥体面的计算可以从几何学和投影学角度进行分析。
从几何学角度来看,视锥体是由相机位置、视角、远近裁剪面等参数决定的一个几何形状,可以通过数学计算来确定其在场景中的具体位置和形状。
从投影学角度来看,视锥体面的计算还涉及到透视投影、裁剪和投影变换等技术,以确保最终渲染的图像能够正确表达相机的视角和场景的深度感。
除了基本的视锥体面计算外,Cesium还提供了一些高级的视锥
体优化技术,比如视锥体裁剪、级联阴影技术等,以进一步提高场景渲染的效率和质量。
综上所述,Cesium库通过内置的视锥体计算功能,可以帮助开发者确定场景中相机可见的区域,从而实现高效的地理空间数据可视化。
通过深入理解视锥体的几何学和投影学原理,开发者可以更好地利用Cesium库的功能,实现更加复杂和高效的地理空间数据可视化效果。
基于自适应二叉树的场景视锥体裁剪算法

基于自适应二叉树的场景视锥体裁剪算法牛鹏;廉东本;苏谟【摘要】建立逼真而丰富的三维场景是可视化领域的主要任务. 场景的数据管理和可见性判断对后续渲染的质量和效率起到了至关重要的作用. 为了弥补传统场景组织方式在实际应用中的缺陷, 本文采用自适应叉树场景组织算法对场景进行管理, 采用层次化裁剪的方式对场景树的节点进行视锥体裁剪, 在裁剪过程中所操作的对象是节点中的包围球和包围盒. 实验表明, 这种基于包围球和包围盒的层次化的视锥体裁剪算法大大的减少了参与裁剪的节点的数量, 提高了裁剪的精确性, 具有较好的裁剪效率和较高的稳定性.%Building realistic and rich 3D scenes is the main task of visualization. The data management and visibility judgments of the scene play a crucial role in the quality and efficiency of subsequent rendering. In order to make up for the shortcomings of traditional scene organization in practical application, this study adopts the adaptive binary tree scene organization algorithm to manage the scene, and uses the hierarchical cutting method to cut the nodes of the scene tree. In the process of cutting, the object of the operation is the bounding sphere and bounding box in the node. Experiments show that this layered algorithm based on the bounding sphere and bounding box greatly reduces the number of nodes involved in cutting and improves the accuracy of cutting. It has better cutting efficiency and high stability.【期刊名称】《计算机系统应用》【年(卷),期】2018(027)003【总页数】5页(P228-232)【关键词】场景的数据管理;可见性判断;自适应二叉树;视锥体裁剪;包围球;包围盒【作者】牛鹏;廉东本;苏谟【作者单位】中国科学院大学, 北京 100049;中国科学院沈阳计算技术研究所, 沈阳 110168;中国科学院沈阳计算技术研究所, 沈阳 110168;中国科学院大学, 北京100049;中国科学院沈阳计算技术研究所, 沈阳 110168【正文语种】中文随着计算机硬件与虚拟现实技术的发展,应用于场景的模型的数据规模呈指数级增长,场景的结构也更加复杂. 尽管图形渲染已经在硬件方面得到了很好地支持,却仍不能解决场景在图形实时渲染方面的问题,还需对相关的裁剪算法进行分析研究. 所以,在克服传统场景组织方式弊端的基础上,能够有效地减少绘制对象,降低模型复杂度,提升裁剪和场景渲染的效率,就成为本文研究所关注的内容.在三维场景中,模型作为基本的组成单位,一般是以点线面的存储结构的,这种点线面的数据结构适用几何建模,但不能体现场景中的空间分布情况. 比较有效的方法是对场景进行空间分割. 并用树结构进行组织,这样可以把空间无序的场景模型变成一棵空间有序的层次树. 对层次树的操作也就等同于对整个场景的操作.本文提出了采用自适应二叉树空间分割算法负责场景的组织管理,在可见性判断方面,采用了一种基于包围球和包围盒的层次化的视锥体裁剪算法,在充分发挥自适应二叉树空间分割算法的优势的基础上,该视锥体裁剪算法有效地降低了场景模型的复杂度,提高了裁剪的精确度,提升了三维场景的绘制效率.1 场景组织及视锥体裁剪算法针对传统二叉树(BSP)[1]存在的问题,本文采用自适应二叉树算法(Adaptive Binary Tree,ABT)进行场景的组织管理,其较强的自适应性,适合剖分任何类型的场景. 与传统的八叉树[2]相比,ABT提供了“多态”的优点,在某种意义上是几何模型和空间划分的抽象,而不限于固定的形状. 它主要用在复杂3D场景下的视锥体裁剪. 而八叉树由于其严格的空间结构,增加了可见性计算的开销. 这可以通过使用松散的八叉树来缓解,但是仍然有很多限制,特别是八叉树并不能保证网格数据的唯一性(这在现代3D硬件上是非常重要的),此外,八叉树不如自适应二叉树那样平滑地适应于几何体的分割. 基本上,为了中等或复杂场景的通用渲染,ABT比八叉树更有效率. 在视锥体裁剪方面,对场景树中的节点的采用层次化裁剪的方式来剔除模型中冗余的数据,降低三维模型的复杂度,提高后续的渲染效率.1.1 场景组织1.1.1 自适应二叉树的建立ABT算法基于场景的几何体对空间进行分割. 分割平面由一个考虑了多种不同参数(分割面的数量和位置等)的评分系统决定,使得到的分割平面更适合特定类型的场景的模型划分. ABT建立的具体算法的执行流程如图1所示.在创建过程中,首先,将与坐标轴对齐且覆盖整个场景的包围盒作为根节点(在创建节点的过程中,每个节点中都要存放一个包围盒和包含该包围盒的一个包围球,用来进行后续的裁剪和碰撞检测). 然后,开始执行一个递归剖分函数,该递归剖分函数的功能就是将当前的包围盒用一个垂直于三个主坐标轴之一的分割面分开,作为当前节点的两个子节点. 然后分别对两个子节点继续进行细分,直到节点中的面的数量达到预定阈值或树的深度上限.1.1.2 最佳分割面的获取准则求解最佳分割平面是ABT创建过程中最重要的部分,其目的是对当前包围盒中的几何体进行有效地分割,使得建立的场景树更有利于后续的裁剪和渲染.在文献[3]描述了求解有效分割面的标准.图1 自适应二叉树的构建流程图标准1. 最优空间定位该标准侧重于分割当前节点包围盒最长坐标轴的分割平面.f1(pos)=max(split_x_axis,split_y_axis,split_z_axis)标准 2. 子节点体积该标准侧重于将当前节点分割成对等体积子节点的分割平面.f2(pos)=abs(volume_child1-volume_child2)标准 3. 面的数量该标准侧重于将当前几何体表面均匀地分布到所有叶子节点上的分割平面.f3(pos)=abs(numfaces_child1-numfaces_child)标准 4. 被分割的面的数量计算几何体被分割平面分割的面的数量. 被分割平面分割的面越多,该分割平面越不适合作为分割面.f4(pos)=total_number_of_split_faces上面所有函数必须最小化,才能找到最优的剖分平面. 另外,每个函数都有一个权重因子,根据场景类型的特点,灵活的设置权重因子,权重因子分布取决于场景策略的选择,从而保证算法更可控、有效. 最终可获取可行平面时必须最小化的方程:1.1.3 获取最佳空间分割面的步骤步骤1. 采用随机采样方法,确定用于分割的候选面数据集.步骤2. 采用评分函数对候选面数据集中的每个候选面进行评分,分数最高者则为最佳分割面.步骤3. 采用最佳分割面对节点进行分割.1.2 基于自适应二叉树的视锥体裁剪算法三维场景规模越来越大,能够有效地减少绘制对象,降低模型复杂度,是三维渲染引擎中实现复杂场景快速绘制的关键所在. 可见性判断是一种很有效的方法,可见性裁剪算法[4,5]常常分为3类:视锥体裁剪、背面裁剪和遮挡裁剪. 本文主要研究在自适应二叉树的场景组织的基础上采用基于包围球[6]和包围盒[7]的层次化的裁剪方式进行视域剔除. 在既定的场景中,采用ABT算法来组织场景元素,面片在在叶子节点中分布的更加均匀,树的深度达到最佳,形成了一棵高效平衡的二叉树,基于此优势,在该数据结构上进行视锥体裁剪,会大大的提高裁剪的效率.1.2.1 算法描述该算法的原理是首先利用ABT算法对场景中的对象进行组织,构建起自适应二叉树,自适应二叉树中的每个节点都包含了一个包围球和包围盒(轴对齐包围盒),然后在视锥裁剪方面,采用递归的方式对树中的节点进行裁剪处理,首先,判断节点的包围球是否在视锥体内,如果包围球位于视锥体内,那么就说明该节点分支下的所有子节点均是可见的,所以可直接送入渲染管道进行绘制. 如果包围球位于视锥体之外,则说明该节点及分支下的子节点均不可见,则可以直接停止对该分支上的节点的可见性判断,从而节省了CPU的周期开销. 当包围球与视锥体相交时,就开始判断视锥体与包围球中的轴对齐包围盒的位置关系,如果包围盒位于视锥体内,同样将该节点及其分支节点直接送入渲染管道进行绘制. 如果包围盒位于视锥体外,则停止对该节点及其分支子节点的可见性判断. 如果包围盒与视锥体相交,则继续遍历其子节点,然后对其子节点同样进行基于包围球和包围盒的可见性判断. 该算法的执行流程图如图2所示.图2 基于包围球和包围盒的视锥体算法执行流程图1.2.2 确定包围球、包围盒与视锥体的位置关系确定包围球是位于视锥体内、视锥体外还是与视锥体相交实际上是一个非常简单的过程,需要做的是计算球体中心到视锥体的6个平面的距离. 如果距离的绝对值小于球体的半径,那么球体与平面相交. 在相交不成立的情况下,如果距离大于0,那么球体位于平面的前侧(也可能在视锥体内). 如果小于0,那么球体位于视锥体背面,绝对在视锥体之外. 判断包围球与视锥体位置关系的流程图如图3所示.确定视锥体与包围盒的位置状态,用以下方式来完成该操作,首先,用三个最小值和三个最大值来定义包围盒,然后将该包围盒的8个顶点与视锥体进行比较. 如果所有的点在视锥体内,那么说明这个包围盒位于视锥体内,如果包围盒至少有一个顶点(但不是全部)不在视锥体内,则说明包围盒与视锥体相交. 如果包围盒所有的点都在特定的视锥体平面的背面. 那么这个包围盒位于视锥体的外面,是不可见的. 考虑到,视锥体完全包含在包围盒内的情况. 在这种情况下,这些点都不在视锥体内,但包围盒仍然被视为可见的. 判定算法的执行流程图如图4所示.图3 包围球与视锥体位置关系的判断的流程图图4 包围盒与视锥体位置关系的判断的流程图2 实验结果及分析本实验的硬件配置: CPU Intel Core(TM)i3-4160 3.6GHz,四核处理器,内存为 4 GB,显卡类型为NVIDIA GeForce GT610,显存大小为1 GB. 软件环境:Windows 7旗舰版64位操作系统,OpenGL4.3版本,VS2015,NVIDIA驱动版本R320,OSG 版本号3.4. 设置可视化场景生成时屏幕的分辨率为800 * 600.本文将自适应二叉树场景组织算法和基于包围球和包围盒的层次化视锥体裁剪算法应用到三维渲染引擎上,通过实验,对本文提出的裁剪算法与文献[8]中提出的基于几何投影降维的裁剪算法(该算法是在二维投影的平面上采用传统的Cyrus-Beck算法完成对视锥体的裁剪)在裁剪的性能上作了测试,测试结果如表1和表2所示.表1 基于包围球和包围盒的裁剪算法的性能注:平均裁剪所用时间为: 0.0041 s.裁剪所用时间(秒)第一次 200000 60000 0.0041第二次 200000 60000 0.0034第三次 200000 60000 0.0052第四次 200000 60000 0.0041第五次 200000 60000 0.0034第六次 200000 60000 0.0041实验次数模型多边形总数(个)划分成节点总数(个)表2 基于几何及投影降维的裁剪算法的性能注:平均裁剪所用时间为: 0.0079 s.裁剪所用时间(秒)第一次 200000 60000 0.0081第二次 200000 60000 0.0076第三次 200000 60000 0.0083第四次 200000 60000 0.0074第五次 200000 60000 0.0081第六次 200000 60000 0.0076实验次数模型多边形总数(个)划分成节点总数(个)通过所得数据发现,两种算法在场景组织方面因为均采用自适应二叉树算法,所以在模型的多边形总数一致的情况下,所生成的节点总数是相同的,对于裁剪,在时间消耗上,基于包围球和包围盒的裁剪算法所花费的时间要少于基于几何投影降维的裁剪算法,特别是在场景复杂的情况下本文提出的裁剪算法的优势会更加突出.3 结语本文采用自适应二叉树的场景组织结构来对场景进行管理,其高效的分割平面的选择机制,使其具有很强的自适应性,可以用来划分各种类型的场景. 然后在此场景结构的基础上对可见性裁剪算法进行了研究,在视锥体裁剪方面,采用了基于几何包围球和包围盒的视锥体裁剪算法,该算法充分利用了自适应二叉树的场景结构的优势,在一定程度上减少了参与裁剪计算的节点的数量,提高了裁剪的效率,特别适合于复杂场景中各个模型的裁剪. 接下来将进一步研究如何将本文采用的场景组织算法和裁剪算法高效地运用到三维动态场景中去.参考文献【相关文献】1黄晓康. 基于BSP和四叉树的场景管理研究[硕士学位论文].南京:南京理工大学,2008.2张宇. 一种基于八叉树的动态场景管理方式. 电脑知识与技术,2015,11(14): 54-57.3Dickheiser M. Game programming gems 6. 孟宪武,译. 北京:人民邮电出版社,2007. 339-341.4Yagel R,Ray W. Visibility computation for efficient walkthrough of complex environments. Presence:Teleoperators and Virtual Environments,1996,5(1): 45-60.[doi:10.1162/pres.1996.5.1.45]5Zhang HS,Manocha D,Hudson T,et al. Visibility culling using hierarchical occlusion maps. Proceedings of the 24th Annual Conference on Computer Graphics and Interactive Techniques. New York,NY,USA. 1997. 77-88.6王倩,高保禄,高锐军,等. 基于四叉树包围球和屏幕误差的LOD算法. 微电子学与计算机,2016,33(5): 127-132.7彭艳莹,陆国栋,李基拓,等. 基于包围盒编码的三维线段裁剪新算法. 计算机辅助设计与图形学学报,2003,15(11):1369-1374. [doi: 10.3321/j.issn:1003-9775.2003.11.008]8余沛文. 视锥体裁剪几何算法与测试方法研究[硕士学位论文]. 上海:东华大学,2016.。
一种基于投影的视锥体裁剪算法(英文)

一种基于投影的视锥体裁剪算法(英文)
王超一;丁莹;张鑫;李翔
【期刊名称】《系统仿真学报》
【年(卷),期】2014(26)10
【摘要】针对现有视锥体裁剪算法存在的一些问题,如计算效率过低,所得结果与真实情况差距过大的情况,提出了1种基于投影的视锥体裁剪算法。
根据视锥体在三维空间中所处的位置确定其在水平面投影的等效形状,根据视锥体在三维空间中所处的位置以及视锥体的参数计算投影等效形状的相关几何信息,通过点的裁剪计算得出位于视锥体内的地形块。
实验结果表明,提出的算法能够明显的提高计算效率,并且有效的筛选出存在视锥体内的地形块。
【总页数】6页(P2412-2417)
【作者】王超一;丁莹;张鑫;李翔
【作者单位】北京航空航天大学自动化科学与电气工程学院
【正文语种】中文
【中图分类】TP391.9
【相关文献】
1.一种基于模拟退火算法岩体可爆性分级的投影寻踪回归方法
2.基于World Wind 三维模型加载的视锥裁剪改进算法研究
3.基于自适应二叉树的场景视锥体裁剪算法
4.基于空间投影的三维管线裁剪算法
5.一种基于动态投影和扫描线裁剪的快速瓦片缓存生成方法
因版权原因,仅展示原文概要,查看原文内容请购买。
一种新的视截体裁剪算法

一种新的视截体裁剪算法
黄建国;黄穗
【期刊名称】《网络新媒体技术》
【年(卷),期】2009(030)012
【摘要】在常用视截体裁剪算法的基础上本文提出了一种新的视截体裁剪算法.通过由顶点发射出的射线与视截体六个平面的位置关系来判断该点是否在视截体内.常用的算法需要计算顶点到平面的距离,而新算法只需要判断顶点发出的射线与平面的相交情况,所以需要的计算量比常用的视截体裁剪算法要少,计算过程更直观.同时游戏层次采用常见的八叉树分割方式,将其分割成一颗八叉树,其中每个结点是一个立方体(即包围盒),这给视截体裁剪带来方便.
【总页数】5页(P18-22)
【作者】黄建国;黄穗
【作者单位】暨南大学计算机系,广州,510632;暨南大学计算机系,广州,510632【正文语种】中文
【相关文献】
1.一种新的任意四边形窗口线裁剪算法 [J], 李雪;石广田
2.一种新的矢量数据多边形的快速裁剪算法 [J], 张钧;王鹏
3.一种新的基于并行分段裁剪的DTW算法 [J], 安镇宙;杨鉴;王红;余映
4.-种新的线段裁剪算法-四区域裁剪算法 [J], 曹汉清;陈天滋
5.一种有效的任意多边形的线裁剪新算法 [J], 唐棣;单会秋
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2017年2月图 学 学 报February 2017第38卷 第1期JOURNAL OF GRAPHICSV ol.38No.1第一作者:于海燕(1974–),女,黑龙江牡丹江人,副教授,博士。
主要研究方向为CAD/CG 。
E-mail :yuhy@ 通信作者:张 帅(1993–),男,河南驻马店人,硕士研究生。
主要研究方向为CAD/CG 。
E-mail :1543965553@视锥体裁剪几何算法研究于海燕1, 张 帅1, 余沛文1, 何援军2(1. 东华大学机械工程学院,上海 201620;2. 上海交通大学计算机系,上海 200240)摘要:从几何角度出发,以投影理论为指导,设计了一种降维投影的视锥体裁剪几何算法。
基本思想是基于视锥体构建计算坐标系,在计算坐标系下,向两个投影平面做正投影。
空间中被裁剪线段与视锥体的位置关系被简化为投影平面内线段与等腰梯形的关系。
这种几何化的降维方法有利于解决空间几何奇异问题。
构建了空间视锥体裁剪中线段与视锥体的各种位置关系的测试样本,特别是78种处于几何奇异状态的位置关系,用于综合评估算法的速度和稳定性。
用C 语言在VC++平台上分别实现了投影降维的视锥体裁剪几何算法、经典的Liang-Barsky 算法和与6个面分别求交的一般算法。
在定性分析基础上,利用测试样本对3种算法做了计算速度与稳定性方面的测试对比。
关键词:视锥体裁剪;几何算法;投影理论;几何奇异中图分类号:TP 391.72 DOI :10.11996/JG .j.2095-302X.2017010001 文献标识码:A 文 章 编 号:2095-302X(2017)01-0001-04View Frustum Culling Geometric AlgorithmYU Haiyan 1, ZHANG Shuai 1, YU Peiwen 1, HE Yuanjun 2(1. College of Mechanical Engineering, Donghua University, Shanghai 201620, China;2. Department of Computer Science & Engineering, Shanghai Jiao Tong University, Shanghai 200240, China)Abstract: From the point of view of geometry, a view frustum culling geometric algorithm is designed based on projective theory in descriptive geometry. The basic idea is that a proper computational coordinate system is built, where the space position relation of the view frustum and a line segment is transformed into the plane position relation of a trapezoid and the line segment by simple orthographic projection. This geometric dimension reduction method is beneficial to solve space geometric singular issue. A test sample is designed which includes all kinds of typical position relations of the view frustum and the line segment to comprehensively evaluate algorithm’s speed and stability. And especially, there are 78 kinds of geometric singular relations. At last, our view frustum culling geometric algorithm, classical Liang-Barsky algorithm and a basic algorithm to solvethe problem of intersection with 6 planes have been implemented on Visual C++ with C program. On the basement of qualitative analysis, these 3 algorithms have been tested on speed and stability. Keywords: view frustum culling; geometric algorithm; projection theory; geometric singular随着三维几何模型愈发复杂、逼真,虚拟环境的场景规模越来越大,如何有效减少绘制对象,降低三维模型的复杂度,是三维显示系统中快速稳定绘制复杂场景的关键所在。
近年来,可见性的判断是一种有效方法,在大规模的复杂场景中,虽然需要绘制对象的数量大幅增加,但对于观察2 几何设计与计算 2017年者来说未必增加了很多,一般而言可见实体的数目要远远小于实体数量总和。
例如,观察者在房间内,可看到房间内的部分物体还可通过门窗看到外面部分的物体;观察者站在房间外,则只能看到房间的外表面,房间内部环境是不可见的。
实际绘制量与场景规模之间存在着很大差异,这是可见性研究的基础和依据[1]。
可见性剔除算法(visibility culling)[2-3]可分为3类:遮挡剔除(occlusion culling)、背面剔除(beck-face culling)和视域剔除(view frustum culling)[4]。
视域剔除又被称之为视锥体裁剪,是计算机图形学中一个重要的基础算法,视锥体裁剪算法在计算机图形学中主要应用于虚拟现实环境和CAD/CAM等工程领域。
视锥体(frustum)是指场景中摄像机可见的一个锥体范围。
由上、下、左、右、近、远共6个面组成。
在视锥体内部的景物是可见的,反之则不可见。
为提高性能,一般只对与视锥体有交集的对象进行绘制。
视锥体裁剪算法要实现的功能就是视锥体和线段求交,将视锥体内的部分显示出来,外部的视为不可见。
通过视锥体裁剪算法能判定出大量不可见的部分,大大减少了送入绘制管道的数量,从而极大地提高了图形的显示性能[5]。
1 相关研究常见的视锥体裁剪算法有包围盒裁剪算法、参数形式的裁剪算法、基于编码的裁剪算法、混合裁剪算法、一般裁剪算法和其他算法[6]。
其中Liang-Barsky算法[7]作为一种比较成熟的算法,常被很多新算法作为比较对象。
Liang-Barsky裁剪算法是将被剪裁线段用含参数的表达式表示,并通过代数运算推导得到参数的值,将三维裁剪问题转化为3次一维裁剪问题,再将一维裁剪问题转化为解一组关于参数的不等式,即可得到线段在视锥体内可见部分的参数值范围。
此算法逻辑简单、通用性强、计算量少、程序简洁、且计算量相对稳定,是一种高效的参数形式的裁剪算法。
此外,视锥体的表面是由6个面围成的,求线段在视锥体内的可见部分即求线段与6个面的交点,再找到2个有效交点即为所求,这就是一般裁剪算法的原理;这种算法思路清晰,核心是求视锥体6个平面的方程,然后再求线段与每个面的交点;整个过程在世界坐标系下进行,不需任何坐标变换、分区、编码等其他操作,且求解速度较快,求解全程采用代数计算,是一种典型的代数算法。
三维线段裁剪是3D显示系统都要做的底层技术,对算法的效率要求较高[8]。
由于算法的速度是衡量一种算法优劣的核心因素,因此对三维线段裁剪算法速度的研究一直也是国内外研究的热点。
但这些算法不足有两点:①这些算法均以代数方法为主,几何的方法只是作为辅助,从算法的描述上来讲,公式繁多、交流不便、几何意义不明显;无论是上文提到的参数化的Liang-Barsky算法,还是代数运算的一般算法都存在这些问题,使得程序的可读性不强。
②这些算法大多只关注算法的速度而未涉及算法的稳定性,特别是几何奇异位置,当系统稳定性非常差时可导致整个系统的瘫痪。
针对以上两个问题,依据画法几何投影理论,从几何的角度[9]来解决上述问题,提出了基于几何以及投影降维的视锥体裁剪算法(视锥体裁剪几何算法),将复杂的三维问题转化为简单的二维问题。
同多数以代数为主的算法相比,这种具有几何意义的算法降低了复杂度,通过降维使得几何奇异关系变得相对清晰、简单。
其次,可改造性比较强。
算法每一步都有其相对应的几何意义,所以当调试程序出错时,能够相对容易地发现算法的错误与不足,进行修改或完善。
上述几何算法的优点是很多代数为主的算法所不具备的。
通过对几何奇异情况分类方法的讨论,设计了一套相对客观、详细的算法的测试样本,选择高效且具代表性的Liang-Barsky算法和6面求交一般算法,以及本文的几何算法,在VC++平台上分别实现并进行全面、对等测试。
2 计算坐标系的建立通常情况下,世界坐标系下的视锥体以及直线段在空间所处的位置是随机的,为了使计算方便,需要进行坐标系转换,建立一个全新的计算坐标系,然后选择合适的投影面做直线段与视锥体的正投影。
计算坐标系的选取应尽量使投影后的平面几何关系简单,便于计算。
对于一个视锥体A1、A2、A3、A4、P b和P t是已知的(图1),由这些点能确定唯一的视锥体。
在三维空间,从任意一点出发的3个不共面的向量能构成一个三维的坐标系,3个向量可定义为:(1) 以后端面的中心P b作为计算坐标系原点,向量b tP P作为z轴正向,设1111==(,,)b tb tP Pa b cP Pn作为z轴正向单位向量。
第1期 于海燕,等:视锥体裁剪几何算法研究 3(2) 以向量1b P A作为x 轴正向,设122221==(,,)b b P A a b c P A n 作为x 轴正向单位向量。
(3) 最后由n 3=n 1×n 2=(a 3, b 3, c 3),得到y 轴正向单位向量。
则由P b 点以及互相垂直的3个单位向量n 1,n 2,n 3,构成了一个新的坐标系,如图1所示。
图1 计算坐标系下的视锥体由世界坐标系下P b (P b .x , P b .y , P b .z )变为计算坐标系原点(0, 0, 0),可以得到一个平移矩阵的元素d 1,d 2,d 3以及其逆矩阵元素D 1,D 2,D 3。