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

屏幕空间背面剔除算法原理屏幕空间背面剔除算法(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(编辑多边形)命令将实体法线翻转形成室内空间。
- 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。