爱是什么样子的

爱是什么样子的,第1张

计算机游戏的分类(角色扮演类重点)

RPG 角色扮演类(三要素:艺术性+故事性+交互性);FPS第一视角射击游戏;ACT 动作类游戏; 格斗游戏; 回合制策略游戏;实时策略游戏;模拟游戏 ;冒险游戏;体育类游戏;赛车游戏;

二维游戏中四种常用地图创建和现实方法(前三种)

固定地图、滚屏地图、多层次地图、菱形地图

固定地图:使用固定的背景作为地图,将屏幕切割成棋盘状的一系列小块,在内存中保持一个二维数组,保存每个小块对应的编号,绘制时根据数组提供的信息,在每个小块画上相应图

滚屏地图:

是固定地图的进一步扩展,可以显示远大于固定地图的图像

根据玩家所在位置,确定显示的地图部分

多层次地图:多层次地图的实现思想,视差卷轴(Parallax Scrollers) :

在滚屏地图的基础上设置多个层次的地图。例如,设从底往上分别为0层,1层,…把地图数据数组改为三维数组。

使每个图层以不同的速度运动,模拟景物远近不同的层次感。

菱形地图:菱形地图是在二维画面上表现三维场景的常用技术

精灵动画和精灵类设计层次

一幅背景图&一组模板图(mask)将上一帧中精灵出现的地方用背景填充,并在新的指定地点绘制精灵

对动画序列中的每一帧,1) Load 背景图 2)确定sprite绘画的位置

将某一掩码图与背景图作AND运算 4)将对应的人物图与背景图作OR运算

5)更新sprite绘画的位置

精灵类的基本功能:图像分割 ,frame设置 ,精灵定位与绘制 ,

精灵转动与翻转 ,精灵参照点和目标定位,精灵碰撞检测

基于景物包围盒的场景组织(包围球,AABB,OBB,平行六面包围体,k-dop)

包围球:包围物体的最小球体;

AABB: axis aligned bounding box,轴平行包围盒 结构是平行于坐标轴的包围物体的最小长方体;

OBB:oriented bounding box 有向包围盒本质上是一个最贴近物体的长方体,只有通过该长方体可以根据物体的一阶矩任意旋转。比包围球和AABB更加逼近物体,能显著减少包围体的个数。

k-dop: discreted orientation polytope 离散有向多面体,是指由k/2 对平行平面包围而成的凸多面体,其中k为法向量的个数。如平行六面包围体

优化场景绘制的几何抛分技术(重点bsp)BSP树,四叉树, 八叉树,均匀八叉树剖分

BSP树(空间二叉剖分) BSP树的根节点就是整个场景,每个节点所代表的区域被平面分成两部分,一部分是平面前面(左侧)区域的子节点,另一部分是平面后面(右侧)的子节点。子节点剖分将一直向下递归,直到空间内部没有多边形或者剖分的深度达到指定的数值时才停止。此时,叶节点代表了场景几何分布的凸区域。

Bsp 树的广度优先和深度优先遍历代码。(重要)

LOD技术原理,2种常用的LOD细分方法

LOD level of detail 层次细节技术。

基本原理:利用透视投影的特性——距离当前观察点越远的物体,其在成像平面的投影面积越小,因而对远处的物体在绘制阶段可用较少的等效绘制元素来表现它。

层次细节技术主要包括:基于顶点删除|、基于边删除、基于面删除。

其中基于边删除的简化算法最为有效,关键在于选取正确的被删的边,以及新生成顶点的位置和纹理坐标。一种解决方法是并不生成新的顶点位置,而是令某个顶点与另一个顶点重合,在每次简化过程中,选择被删除的边事一个需要仔细衡量的过程。解决方法是定义代价函数,对所有候选边计算删除代价并选择代价最低的边。代价函数的选择和具体应用有关,前提是防止边删除后出现相交的边或者三角形。另外一个准则是考察边的两个顶点的法向的前后变化,如果变化过大,则优先度低。其他代价函数尺度可以使新生成边的长度、新顶点被删除三角形的距离等。算法必须记录从精细模型到简化模型之间的边删除过程,利于在相机靠近物体时从简化模型恢复到精细模型。

可见性计算基本原理(culling)

背面剔除(back-face culling):对物体预先分块,对每个块的所有顶点的法向计算变化范围,形成法向锥,法向锥进而被用于背向剔除的判断。

视域剔除(view frustum culling)裁剪面剔除(occlusion culling)

潜在可见集(PVS)方法

PVS算法本质上是一种预处理技术,与遮挡面剔除技术在加速绘制的原理上相同,都是通过减少当前绘制所需要考虑的景物的数目来提高实时绘制的速度,但在具体实现的技术路线上不同:遮挡面剔除技术预先剔除那些肯定不可见的面或景物,而PVS方法预先提取出那些潜在的可见面。

碰撞检测基本原理,基于空间剖分结构的碰撞检测方法(eg 遍历层次包围体二叉树的递归算法)

1)基本原理:场景中的物体两两进行碰撞检测,复杂度O(n2)。在处理复杂场景中,基本策略是快速排除明显不发生碰撞的物体,确定潜在的相交区域或相交物体对,尽可能减少进行精确求交的物体对或基本几何元素。从此策略出发,通常有两种思路。一是着眼于场景中的物体之间的关系,快速排除明显不相交的物体对。在获得潜在可能相交的物体之后,可层次遍历物体对的预先构建的层次包围体树,递归检测各层节点包围体之间的相交情况,直到各层次树的叶子节点,最终获取物体对的相交检测结果。二是以场景所在的空间为载体,通过对场景的规则剖分,加速确定可能存在物体相交的区域。随后把潜在相交区域的子空间继续剖分下去,直到找到最精细的空间层次,并取出想应的相交物体的多边形。在此基础上,进行精确的相交测试,获得碰撞区域的详细信息。

2)基于空间剖分结构的碰撞检测方法

场景的层次剖分方法主要有均匀剖分、BSP树,K-DOP树和八叉树。

基于场景BSP树的碰撞检测递归算法。输入时场景的BSP剖分结构和需要检测的物体,计算该物体是否与可能存在的相交物体的子区域。

纹理融合模式和纹理映射中的反走样技术

A)纹理融合模式 取出的纹理值可以经过人意的数值计算,并于物体经过光照明计算的颜色,或保存在帧缓冲器中的颜色进行融合计算,常用融合函数有以下3类。

替代:纹理值替代目标值 2)渐变:与替代的区别在于,如果打开alpha 通道,那么将纹理颜色与目标颜色值进行融合,但alpha值保持不变。 3)相乘:颜色纹理与目标颜色值相乘。

B)反走样技术 常见纹理走样问题,包括 Moire效果、锯齿、斑块、模糊、水纹、亮点等。

MIP映射技术是图形学中最常用的纹理反走样技术,试图解决当相机原理纹理所在区域时出现的走样现象,基本思路是保证像素尺寸和纹理尺寸大致相等。

游戏中常用的4种滤波方式如下:

点采样滤波:最简单、最快速的滤波方式。给定一个纹理坐标u、v,取与它们最邻近的纹素值作为颜色。会带来严重走样。

双向滤波:计算纹理坐标在最邻近的4个纹素之间的双线性插值。有助于解决放大的走样问题。与MIP映射技术结合,最常用的纹理滤波模式。

三线性滤波:选择最合适的两个相邻MIP层次,在每个MIP层次执行双向滤波后,再在两个MIP层次之间进行线性插值。

各向异性滤波:双向滤波和三线性滤波都采用各向同性滤波,即认为纹素周围的各个滤波方向的权重是一样的,当多边形斜对着相机时,这种各向同性采样方式会带来一些走样,各向异性则最大程度解决了这个问题。

凹凸纹理映射(掌握2种)

凹凸纹理映射技术可以用来模拟粗糙物体表面凹凸不平的细节,通过扰动表面的法向量来实现。

原理:凹凸映射是补色渲染技术的一项扩展,只是在补色渲染里,多边形表面上的法线将被改变,这个向量用来计算该点的亮度。

方法1:记录有符号数(bu,bv),用于偏移法向

方法2:记录高度场,用于差分计算法向。---->如图

浮雕型凹凸纹理映射

最简单,直接计算漫射光亮度,不进行光照明计算

步骤(1)绘制半亮度图

(2)绘制反色半亮度图 --->

(3)将结果和顶点光照明计算结果与纹理映射做乘积型融合 *** 作

B)法向映射:输入法向图,记录扰动后的曲面法向,数据来源是高度

给出一个模型和一个法向图:

(1)对每个多边形,光源向量变换到每个顶点处的局部切向空间坐标;

(2)对每个像素,对插值后的光源向量进行归一化;

(3)将光源向量与法向图中记录的法向点击,获得漫射分量;

(4)插值半角向量,计算高光分量;

(5)融合本身的纹理颜色,获得最后的效果

C)细节映射:法向纹理的来源除高度图外,也可以是物体表面的属性,如法向,颜色,材质等这类纹理称为细节纹理 创建过程:

(1)将高分辨率网格简化为的分辨率网格

(2)参数化低分辨率网格,建立网格和细节纹理的一一对应

(3)根据高分辨率网格的表面细节填充细节纹理

billboard技术 & 伪代码

Billboard技术采用一个带有纹理的四边形,其纹理图像为该Billboard所代表的物体的图像,即用带有该物体图像的长方形,代替该物体生成该物体的图形画面。Billboard 放置于所代表物体的位置中心,并随相机的运动而变化,始终面对用户。技术的关键步骤是讲四边形绕对称轴旋转,变到朝向视点的方向。

阴影生成方法(掌握2种)

平面投影法(Planar Shadow):最简单的生成算法,主要思想是将遮挡物体沿光源方向投影变形到被遮挡的平面上,在平面上作为二维物体绘制,绘制结果直接产生了遮挡物体的阴影。局限性:无法再非平坦曲面上生成阴影,也不能在凹平面上生成阴影;如何控制阴影的颜色。

阴影图算法(Shadow mapping):预计算的纹理,包留了光源的各发射方向上与场景物体的最近距离。在绘制时,计算当前视点下的可见部分与光源的距离,并与相应方向上阴影图保留的距离进行比较,如果前者大于后者,则说明可见点与光源之间存在一个遮挡点,因而位于阴影之中。即利用站在光源处所沿光源法线看去所生成的深度图来检测场景中的物体像素是否处于阴影之中,缺点是光源与物体位置相对固定,在极端情况下计算精度差,不太适合精确到像素的动态光阴场合。

阴影体算法(Shadow Volume)(重要):核心思想是把阴影看成阴影体与场景中被遮挡物体的交集。

深度测试通过的模板阴影体算法。算法流程:

允许写颜色缓冲器和深度缓冲器,打开深度测试并关闭光源;

利用泛光和其他物体表面属性绘制全部场景;

计算构成阴影体表面的多边形;

禁止写颜色缓冲器和深度缓冲器;

如果视点位于阴影体内部,将模板缓冲器初始化为0,否则为1;

设置模板函数为总是通过,模板值 *** 作为:当通过深度测试时,递增1;

打开背向表面剔除功能,绘制阴影体多边形;

设置模板值 *** 作为:当通过深度测试时,递减1;

打开前向表面剔除功能,绘制阴影体多边形;

设置模板函数为判断是否等于0,模板值 *** 作为空;

打开光源,绘制全部场景;

简单说,算法就是从视点向物体引一条视线,当这条射线进入 shadow volume 的时候, stencil buffer 值加一,而当这条射线离开 shadowvolume 的时候,stencil 值减一。如果 stencil 值为零,则表示实现进入和离开 shadow volume的次数相等,自然就表示物体不在 shadow volume 内了。

例子:上图里面视线三进一出, stencil 值为 2 ,表示物体在 shadow volume 内,有阴影产生。

A算法和路径寻找技术

A:启发式搜索技术(使用了启发函数,显著缺点是不能保证在存在解的情况下搜索成功)。

估价函数:f '(n) = g '(n) + h '(n)

其中f '(n) 是估价函数,g '(n)是从从起点到终点的最短路径值, h '(n)是n到目标的最短路径的启发值。

基本想法:选择下一步状态n,使得f(n)是队列中最小的;如果h(n)估计准确的话,方法是可行的

结束条件是:当且仅当目标状态被从优先队列中挑选出来

A不一定找到最优路径

gluLookAt 实现基于键盘的第一人称的视角漫游

一般情况下实现第一人称视角游戏有两种方法,一是移动场景,二是移动眼坐标移动场景方法比较简单,使用glTranslatef与glRotatef配合即可,但一般只在简单场景和单角色的情况下使用,而且角色的各种计算(如实时坐标、碰撞)不好实现,所以不推荐使用;移动眼坐标的方法就非常灵活,它对场景和角色的状态未做任何 *** 作,一般只要设置成跟随主角色移动旋转即可实现第一人称视角视觉效果

Void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble upx,GLdouble upy,GLdouble upz);

该函数定义了视点矩阵,并用该矩阵乘以当前矩阵。eyex,eyey,eyez定义了视点的位置;centerx、centery和centerz变量指定了参考点的位置,该点通常为相机所瞄准的场景中心轴线上的点;upx、upy、upz变量指定了向上向量的方向。gluLookAt 实现基于键盘的第一人称的视角漫游代码 如下:

// 追踪观察点的方向static GLfloat g_eye[]={0,80,0};//视点位置static GLfloat g_look[]={00,00,00};//视点static GLfloat g_Angle = -900;

/如果初始角度设置为0则初始面向X轴正方向,设置为-90面向Z轴负方向,符合默认情况下的设计习惯。

float speed=02f;

if (KEY_DOWN(VK_SHIFT)) speed =speed4;// 增大幅度

if (KEY_DOWN(VK_LEFT)) g_Angle—=speed2; //每按一次左键,旋转2度。

if (KEY_DOWN(VK_RIGHT)) g_Angle+=speed2; //每按一次右键,旋转2度。

rad_xz = float (314159 g_Angle/1800f); //求弧度 //计算SIN和COS函数中需要的参数。 if (KEY_DOWN(33)) g_elev +=02f;

if (KEY_DOWN(34)) g_elev -=02f;

if (g_elev<-100) g_elev =-100;

if (g_elev> 100) g_elev = 100;

//如果按上方向键,沿着转换角度后的方向前进,speed为每次前进的步长,通过sin和cos函数实现沿着现有角度方向前进。

if (KEY_DOWN(VK_UP)){

g_eye[2]+=sin(rad_xz)speed;

g_eye[0]+=cos(rad_xz)speed; }

//如果按下方向键,沿着转换角度后的方向后退,speed为每次前进的步长,通过sin和cos函数实现沿着现有角度方向前进。

if (KEY_DOWN(VK_DOWN)){

g_eye[2]-=sin(rad_xz)speed;

g_eye[0]-=cos(rad_xz)speed; }

g_eye[1] =18;

// 观察点

g_look[0] = float(g_eye[0] + 100cos(rad_xz));

g_look[2] = float(g_eye[2] + 100sin(rad_xz));

g_look[1] = g_eye[1];

glLoadIdentity(); //重置视图

gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1]+g_elev,g_look[2],00,10,00);

return TRUE;

2游戏设计中人员分工和职责

游戏设计师:主设计师,对于要开发的游戏有总体上的把握、前瞻性的理解、策略性的考虑

助理设计师,帮助主设计师进行细化实现,所有设计文档的管理和更新

关卡设计师,设计关卡内部结构,包括建筑、光影、物品摆放、敌人配置,与美工合作—关卡编辑器

剧本作家,通过对故事情节的整理和人物的刻画,使得游戏更有深度

程序员 主程序员,主设计师的左膀右臂,从技术角度对主设计师的Vision进行评估和细化;定义程序的主体框架结构(模块和相互之间的关系,代码标准和接口规范);与制片人合作,共同处理软件工程的管理(例如,是否推翻代码,重新编写)

一般程序员:基本游戏规则程序员 AI程序员 3D程序员 UI程序员 物理程序员 网络程序员 工具程序员

美工:艺术指导,在主设计师直接指导下工作,最重要的工作是帮助确立整个游戏的统一的视觉风格(色彩配置、文化背景、特殊图案、角色设计风格、界面设计风格,the art bible);评审美工的作品

概念美工,简单迅速的画出Vision各种可能的方案(人物设计、场景设计、基本物品等的速写草图);

3D美工,3D软件建模:建筑、人物 动画师,片头和过场动画

2D美工,2D 绘图软件(背景以及sprite),3D模型材质

制片人, 内部制片人:一般意义上的项目经理,负责计划的制定、执行和监控;项目组对外联系的桥梁;人员的招聘与管理。 助理制片人:保证游戏开发顺利的一切琐事

外部制片人:游戏发行公司(投资者)对于游戏开发公司的监督者,根据项目开发进度和效果,决定是否追加下一步投资;可以同时监管几个项目

测试员, 主测试员:在主程序员的指导下工作。根据游戏程序的特点,参与制定一整套测试、报告、修改、审核机制、编制测试报表、制定测试计划、指导协调一般测试员工作。

一般测试员:以玩游戏为工作,以玩游戏为生的人。必须找到程序中的bug,完成细致的记录工作,并及时将报告提交给主测试员

其他设计人员:人机交互界面设计师,网络维护人员,秘书

(一)断面的生成

在断面建模之前,要先导入剖面图和钻孔以及断层线等信息。根据导入的剖面图、断层线和钻孔信息,来生成模型的断层。生成断层有两种方式,即根据剖面上的断层剖面线和根据离散点数据生成。

1离散点断面建模算法

基于不同方法获取的离散点数据,可进行插值生成断面模型,下面是根据离散点来构建断面算法的思想。

(1)求解投影坐标系。断面采用的投影坐标系并非断面的最小二乘面投影坐标系,而是在求得最小二乘面后,将Z方向的偏差置为0,这是一个世界坐标与XOY平面垂直的平面。根据断面的特点,断面在一般情况下是竖直的,这样的投影平面不会出现插值点重叠的问题。该设计是为在查找地层离散点在断层上的投影点时提供一个更有意义的投影坐标系。

(2)求解矩形基础网格,并根据基础网格计算三角网格,根据三角网格包围盒计算一个包围边界。用这个包围边界作为第一次裁剪曲面的边界,得到初始显示曲面。

(3)用户根据需求对初始显示曲面进行编辑或者指定初始显示曲面的裁剪曲面就可以得到显示曲面。重复本步骤,直至满足要求,完成最终的断面模型。

2基于剖面上的断层线生成断面模型

将剖面导入三维建模软件系统之后,对剖面上的断层线进行分析,选定属于相同断层的剖面断层线,然后进行剖分、插值生成断层。如图4-11所示。

图4-11 根据剖面上的断层线生成断层

3基于离散点数据生成断面模型

通过导入的离散点也可以生成断层,或者在钻孔导入三维建模软件系统之后,通过在孔轨迹上指定断层上的钻点,然后通过剖分、插值生成断层。如图4-12所示。

图4-12 根据离散点生成断层

(二)断面的编辑

断层生成之后,根据需要可以编辑断层边界和使用控制点编辑断层,改变断层面的形状,还可以通过修改属性框中的内容来编辑断层的属性等。如图4-13所示。

图4-13 根据离散点生成断层

对地质体中的信息进行修改是重要的功能之一。课题组地质体模型的数据结构中,输入可以是点集合和折线集合,但是折线集合也被示为有序点的集合。所以,对于点的编辑和修改是所有编辑和修改的基础。由于一般图形平台中很难解决计算机图形学中的一个基本问题即“坐标变换”的深度问题,所以只能依赖于生成的三角网格面,实现沿着面和垂直面两个方向的空间点的“位置坐标”编辑,即标量编辑。采用标量编辑,解决了“坐标变换”的深度问题,实现了不依赖于三角网格面的空间点编辑。

此外,还采用了“三维空间矢量点”的编辑功能。“三维空间矢量点”是指工区种的三维点不仅含有“位置坐标”的概念,还赋予每个点一个“方向矢量”。这样,很容易对空间点进行方向上的编辑功能,我们称谓“三维空间矢量点编辑”。本系统中多处采用了这种编辑功能,例如断面上控制点的编辑(图4-13(a))、地层上控制点的编辑、光源矢量的编辑等。光源矢量的编辑效果如图4-14所示。

图4-14 光源矢量编辑功能

(三)定义断面关系

在建模时,对于工区中相交的两个断层,需要确认它们的相交关系,即哪一个是主切面,哪一个是被切面。通过定义它们的关系,实现主断层面剪切辅断层面的功能。在定义主断层面时,一般选择相对较高且长度大于被切断层面在其上的投影面的断层面,这样选择的要求可使系统较快地构建断面网格。

断层主辅关系定义之后,选择“更新断层”功能,生成切割后的断层。图4-15所示为定义断层关系之后重新生成的断层效果。

图4-15 定义断层关系

(四)三角网格边界裁剪算法

网格边界裁剪算法是构建连续曲面的基础算法。在复合结构表示的地质面构建算法中,没有采用根据边界进行三角剖分和插值的方法来构建地质面,而是设计了一种通用性更广、集网格裁剪、网格分割的快速网格边界计算方法。本系统中多处要应用此算法,如主辅断面的裁减、主辅地层的裁减、地层三角网与断面矩形网的裁减等等。

由三角剖分生成的三角网格均匀且易于保证求交精度,而直接切分的三角形势必出现三角形畸形的问题。由于本算法的计算基础是曲面的矩形网格,所以畸形的三角形对算法没有影响。

表4-1是分别由三角剖分和矩形网格映射生成三角网格的效果对比。

表4-1 三角网格效果对比

由表4-1可以看出,三角剖分和矩形网格映射各有优缺点,在本软件中,我们结合这两种方法的优点,设计出了一种全新的三角网格构建方法,具体将在下文中详细介绍。

1裁剪器的设计

本系统中根据地质面边界计算的需求设计了裁剪器的结构。裁剪的核心计算部分是统一的,其他的输入和细节处理部分由虚函数分发到不同的子类处理,具有可维护性高,扩展性好的特点。

初始构建的三角网格由矩形网格映射而成,具有矩形的边界。同时在构建过程中采用了保留拓扑关系的映射方式,使得三角网格中相邻三角形之间有拓扑关系,并且在以后的计算中将保留并维护这种拓扑关系。

在构建地质面过程中,地质面边界可能由于以下情况而发生改变:

(1)用户直接对地质面边界进行编辑。

(2)地质面将地质面的边界改变;地质面被地质面切割包括两种:一种是有矩形背景网格的三角网格被三角网格切割;一种是无矩形背景网格的三角网格被有矩形背景网格的三角网格切割。对于三角网格被三角网格切割的情况,考虑到算法的效率以尽量避免为主,算法不对其进行研究。

(3)在地质面被切割时,还包括局部切割和全局切割的情况。

分析上述地质面切割的特点,发现上述切割有一个共同的特点,即三角网格被切割成两个部分后,网格的形态没有改变,只是网格的边界发生改变。根据上述需求三角网格裁剪的算法输入是:

(1)三角形网格:本算法为了提高运算的效率采用如下的三角网格结构:每个三角形中保存的是顶点的指针和临近三角形的指针。一套三角网格保存着一个顶点集合用来记录所有的顶点。该结构不仅能清晰记录三角形的形状信息和地理位置信息,还能保存同该三角形的相邻拓扑信息,便于查找和运算。本裁剪算法就是以此为基础进行设计和实现的。本算法认为三角网格边界相对于三角网格密度足够光滑,在三角形内部没有拐点。

(2)剪路径:裁剪路径是地质面新的边界,裁剪路径的限制条件是输入的裁剪路径不自交。

根据对输入条件的分析,裁剪三角形的流程是统一的,都是将三角形网格一分为二,只是裁剪路径的决定条件不同。裁剪路径可以是由多边形决定,也可以是由曲面决定,还可以是由其他几何元素决定,本算法根据C++派生类的关系设计了裁剪算法的机制——裁剪器。

构建裁剪器后,只需传入待裁剪的三角网格和裁剪路径,裁剪器就可以完成对三角网格的裁剪工作。不同的路径判断算法需要构建不同的裁剪器,每个具体裁剪器都从裁剪器基类派生而来,裁剪器基类负责三角网格的裁剪工作。这样有利于算法的维护和扩展。

2裁剪器的基本裁剪算法

裁剪算法可以应用于所有三角网格被矩形网格或折线裁剪的情况,并且裁剪时对三角形拓扑关系的维护及重建过程是一致的,采用有拓扑的三角网格结构能起到很好的加速作用。

根据带拓扑关系的三角网格的特点,裁剪算法的流程如图4-16所示。

图4-16 三角网格裁剪流程

具体算法流程为:

(1)确定所有三角形的顶点与裁剪路径的关系,有以下两种可能的关系:①顶点在裁剪路径内;②顶点在裁剪路径外(即将被裁剪掉的部分)。该功能由每个具体的裁剪器来完成。

(2)根据顶点关系将三角形分类:顶点全部在裁剪路径外或全部在裁剪路径上的三角形为不需要裁剪的三角形,其他的为待裁剪三角形。

(3)建立一个待裁剪三角形堆栈,选出一个待裁剪三角形作为初始三角形入栈,开始裁剪:

①在初始三角形中,肯定有两个顶点同侧,如图4-17所示的三角形中顶点c和顶点b同侧;

图4-17 初始三角形

②求解三角形与裁剪路径的交点值,分别记为A和B,具体求交过程由每个具体的裁剪器完成,如图4-18所示:

图4-18 三角形交点

③建立四个新三角形顶点A,B,A'和B',其中A=A',B=B'。建立三个新三角形,分别为△aBA,△B'bc和△A'B'c,如图4-19所示:

图4-19 新三角形结构

④为上述三个新三角形建立拓扑关系,保持三角网格中拓扑的完整性,同时,将ac和ab边所对应的三角形入栈等待处理。记录维护拓扑所需的相应信息后,将初始三角形出栈并将其在三角网格中删除。将栈顶的三角形作为初始三角形重复步骤Ⅲ,直至栈空。

(4)查找待裁剪网格中没有裁剪的三角形,如果有则重复上述步骤(3)。

(5)根据三角网格顶点与裁剪路径的位置关系将三角形网格裁剪为两个三角网格。

(6)裁剪后的三角形网格存在法矢缺失的问题,在显示时,需要考虑到光照和反射才能有较好的三维效果。作为待显示的三角网格,需要补齐法矢。

3裁剪器其他的功能

在基本算法的基础上,为了完成不同对象之间的裁剪,裁剪器还定义了一些其他的功能,包括:计算三角网格同裁剪器的交点、根据空间位置将三角网格顶点划分为裁剪路径正侧和负侧。裁剪器主要有以下几种:

(1)多边形裁剪器

主要用于裁剪多余的三角形,标定曲面的边界和有效范围。多边形裁剪器在裁剪三角网格时,将三角网格分为多边形内部和多边形外部两个部分进行裁剪。在三维地质建模过程中常常需要用多边形来标识断面边界,因此需要使用多边形裁剪器。该裁剪器的功能如下:

工作1:用多边形将三角网格顶点分为多边形内部和多边形外部。

工作2:用三角形边和多边形网格求交点。

(2)矩形网格完全裁剪器

该裁剪器是用矩形网格将待裁剪的三角网格分为两部分,当不能将三角网格完全划分为两个部分时,则矩形网格延长将三角网格完全划分为两个部分—矩形网格正侧部分和矩形网格负侧部分。利用矩形网格来判断待划分的三角网格顶点在矩形网格正侧还是负侧非常高效。可以采用该裁剪器计算断面被其他地质面裁剪后的形态。该裁剪器的功能如下:

工作1:用矩形网格将三角网格顶点分为矩形网格正侧顶点和矩形网格负侧顶点。

工作2:用三角形边和矩形网格求交点。

(3)矩形网格不完全裁剪器

该裁剪器是用矩形网格破坏待裁剪三角网格的拓扑关系,将矩形网格与待裁剪三角网格相交处三角形分为两步分,而三角网格本身并没有被完全割断。该裁剪器用于求解断层分割地层的裂口。该裁剪器的功能如下:

工作1:用矩形网格将三角网格顶点分为矩形网格正侧顶点和矩形网格负侧顶点。

工作2:用三角形边和矩形网格求交点。

经过多次不同裁剪器裁剪后的三角网格形态如图4-20所示:

图4-20 多次不同裁剪器裁剪后的三角网格

提高消隐算法效率的常见方法(利用连贯性,将透视投影转换成平行投影,包围盒技术,背面剔除,空间分割技术,物体分层表示)

选择好的算法, 小心地实现, 同时确定程序不做额外的事。例如, 即使世界上最优化的字符复制循环也比不上不用复制。

当担心效率时, 要保持几样事情在视野中, 这很重要。首先, 虽然效率是个非常流行的话题, 它并不总是象人们想的那样重要。大多数程序的大多数代码并不是时间紧要的。当代码不是时间紧要时, 通常把代码写得清楚和可移植比达到最大效率更重要。记住, 电脑运行得非常非常快, 那些看起来 “低效率” 的代码, 也许可以编译得比较有效率, 而运行起来也没有明显的延时。

试图预知程序的 “热点” 是个非常困难的事。当要关心效率时, 使用 profiling软件来确定程序中需要得到关注的地方。通常, 实际计算时间都被外围任务占用了 (例如 I/O 或内存的分配), 可以通过使用缓冲和超高速缓存来提高速度。

即使对于时间紧要的代码, 最无效的优化技巧是忙乱于代码细节。许多常被建议的 “有效的代码技巧”, 即使是很简单的编译器也会自动完成 (例如, 用移位运算符代替二的幂次方乘)。非常多的手动优化有可能是代码变得笨重而使效率反而低下了, 同时几乎不可移植。例如, 也许可以在某台机器上提了速, 但在另一台机器上去变慢了。任何情况下, 修整代码通常最多得到线性信能提高; 更好的算法可以得到更好的回报。

经过近年来的发展,推进波前法(Advancing Front Technique,AFT)已经成为通用的全自动非结构化有限元网格生成方法之一。该方法最初由Lo提出并用于平面区域三角形网格自动生成(Lo,1985)。AFT方法具有生成的边界网格质量高、易于自适应加密等优点,但不同于Delaunay三角剖分算法,它没有后者那样成熟的理论依据,在很多情形下靠经验解决问题,但是这并不妨碍它的成功应用。

推进波前法的基本思路是:按照剖分规模将边界离散成有序线段,然后从边界出发,依次以边界线段为三角形的一条边,在边界点与内部点中寻找合适点,组成三角形,选取组成三角形顶角最大的点为最终三角形顶点;将已形成三角形的边界线段从边界链表中删除,形成新边界;重复上述过程直到除边界外的三角形的边两侧均有三角形为止。为了更好地说明该算法,下面先介绍几个术语。

3311 二维AFT方法术语定义

(1)剖分域:即需要剖分的区域。正确地定义剖分域(区域的几何描述)是网格能够正常生成的必要条件。剖分域是由一系列有向边界曲线围成的连通域,并且每条边界曲线必须是简单封闭曲线。通常情况下,剖分域的外边界按照逆时针排列,而内边界则按照顺时针排列。

(2)前沿Ω:所有未剖分区域的边界线段以及端点的集合构成Ω,前沿包括活跃前沿(记为Ω1)和非活跃前沿(记为Ω2),其中活跃前沿为当前正在推进的前沿,非活跃前沿为暂时不推进的前沿。

(3)选定前沿S:选定前沿S是Ω中的一个元素。S的选取取决于网格的生成策略,如果为了保证生成网格的尺寸过渡以及保证小尺寸单元优先生成,一般选取Ω中的最小前沿作为S。如果为了程序实现上的便利,则从Ω中从前往后依次选定一个元素作为选定前沿S。

3312 算法要点

(1)选取合适的数据结构建立点、边、三角形之间的关系,并建立储存点、边与三角形的链表。

(2)选取合适的驱动方式。如以三角形的边为基础进行波阵式扩展,必须考虑边的使用次数与方向:任何位于区域边界上的边应且只应使用1次,任何位于区域内部的边应且只应使用2次(正、反方向各1次)。因此,在初始状态,应将边界边的使用次数赋1,内部边使用次数赋0。

(3)以边为基础进行波阵式扩展,是以某边为三角形的一条边,再从点集中寻找合适的顶点组成三角形的过程。所寻找到的点必须满足以下要求:新形成边与已生成的边不能相交;所有边必须满足使用次数要求(边界边使用一次,其余边使用两次);新顶点与该边(有方向)组成的三角形面积必须大于零;保证顶角最大。

3313 算法与程序代码

平面区域的AFT方法主要有三大步:向剖分域中布点、离散剖分域的边界和推进前沿生成三角形。

33131 布点

布点即是根据需要得到的三角形单元的各边的大概长度,在剖分域内生成一系列的散乱点。最常用的方法是先根据剖分域边界上端点的x和y坐标的最大值和最小值,生成一个包含剖分域的矩形,该矩形也叫做剖分域的包围盒;再在矩形中生成点,最简单的是生成“棋盘状”的一系列点,另外是生成“正三角形状”的一系列点;生成一系列点之后,判断这些点是否落在区域内,若是,则为需要布设的数据点,否则,删除;同时需要注意的是若某些点落在了区域内,但是又距离边界太近,依旧删除这些点。图39中(a)为剖分域,(b)则是布设“正三角形状”点的结果。

图39 在平面区域中布点

33132 离散边界

离散边界即是按照剖分规模或需要得到的三角形单元的各边的大概长度将边界离散成有序线段,如图310所示,为布点之后进行离散边界的结果。

图310 离散边界

33133 生成三角形

以三角形的边为基础进行波阵式扩展生成三角形,即以三角形的边为推进前沿,主要过程有如下4小步。

第一步:建立点集PS和边集ES。初始点集PS包括所有布设的数据点和边界离散后小线段的端点。初始边集ES只包括边界离散后的有向线段。此时,边集ES就是前沿Ω。

第二步:以边集ES中的边Ei为基础搜索顶点Pi,即选定Ei作为选定前沿S,以该点为顶点、该边为一边形成三角形。设Ei的端点为A与B,所有待选点Pi与Ei组成的顶角为∠APiB,将顶角从大到小排序,从最大顶角开始,依次选择对应的顶点Pi与Ei组成三角形。如果形成的三角形满足以下要求,则为新三角形,Pi为合适的顶点:①新形成三角形的边与已生成的边不能相交;②所有边必须满足使用次数要求;③新顶点与该边(有方向)组成的三角形面积必须大于零。如果不满足则选下一个顶点。

第三步:找到合适顶点后,将新顶点与选定前沿S(即边Ei)的端点连成的边加入到边集中,生成新的前沿Ω的元素,并将新形成的三角形加入到三角形集中,删除原选定前沿S,选定边集ES中的下一条边作为选定前沿S。

第四步:重复第二、三步,当所有边满足使用次数要求时循环结束。图311中,(a)、(b)和(c)依次为循环一步、二步和多步之后形成的三角形,当循环结束时得到的三角剖分如图312所示。

图311 推进前沿过程

图312 区域的AFT三角剖分

在VC++环境下,只考虑区域外边界时,AFT的完整代码如下,其中函数CreateIn-nerPoint(CSurf surf)用于向剖分区域中布设内部点,结果保存在全局变量m_aNode中;CreateBoundaryPoint(CSurf surf)用于离散边界,离散边界后将边界线段作为初始推进前沿保存在m_aLine中,线段端点保存在变量m_bNode中;函数CreateTrgls(CSurf surf)则是采用推进前沿生成三角形网格,网格的结点和单元分别保存在其成员pNodes和pTrgls中。

三维地质建模方法及程序实现

三维地质建模方法及程序实现

三维地质建模方法及程序实现

三维地质建模方法及程序实现

三维地质建模方法及程序实现

三维地质建模方法及程序实现

三维地质建模方法及程序实现

函数CreateTrgls()中调用的函数SearchID()搜索某一点在顶点集合surf->pNodes的ID;函数CountCos()用于计算当一条线段/边搜索到一顶点并组成三角形时该顶点处角度的余弦值;函数SameLine()用于判断两条线段/边是否相同。

3314 约束的处理

区域三角剖分中的约束是指待剖分区域中存在特定的点或线,称为点约束或线约束,其中约束点必须是剖分后网格的顶点,而约束线必须是剖分后网格三角形的边的集合,不存在某个三角形跨越约束线的状况。

33141 点约束的处理方法

点约束的处理非常简单,直接将约束点加入到生成的点集中,再删除与约束点距离非常近的点,然后就可以按无约束的方法进行三角剖分了。

33142 线约束的处理方法

当待剖分区域存在线约束时,可以将所有线约束作为一种边界。在剖分前,与外边界及内边界的处理方法一样,先按照一定的规模将约束线离散成顺序连接的线段,每条线段均作为三角网格的边,然后设置约束线上的边的使用次数为0,并加入到原始边集中,再按照按无约束的方法进行三角剖分即可完成约束三角剖分。图313(a)为含线约束的待剖分区域,图313(b)为约束剖分网格。

图313 约束三角剖分实例

当需要进行求交运算的界线较少,且每条界线上的线段也不多时,逐一对分别来自两条界线上的线段进行求交运算是可行的。但是,当界线很多时,这种求交方法将花费大量计算时间,效率十分低下。为此,本书将介绍一种算法:先利用网格定位,尽可能排除不可能相交的线段对,然后逐一对可能相交的线段对进行求交运算。该方法的具体步骤如下:

(1)确定界线矩形包围盒。将所有界线上的所有结点按坐标进行排序,找到最小与最大的三维坐标(xmin,ymin,zmin)与(xmax,ymax,zmax),作为矩形包围盒的角点坐标。

(2)矩形包围盒的网格划分。以一定的间距,将包围盒划分成规则六面体格网,3个方向的间距可以不同,也可以相同。

(3)界线的网格定位,即确定每条界线上的每条线段与哪些网格单元相交,并将与某个网格单元相交的线段记录在该单元的相交线段集上。线段与网格单元的相交判断可以根据线段的端点坐标直接定位。

(4)组建可能相交的线段对。在每个格网单元中,将来自不同界线的线段进行组对,并删除重复出现的线段对。

(5)线段对求交运算。

(6)结点的统一编排。将原有界线上的结点、界线的交点按坐标进行统一排序,按一定的阈值合并距离很近的结点,然后重新设置界线与新结点集中结点的关系。

(7)简单弧的划分。将每条界线划分成若干简单弧,保证每条简单弧是唯一的,并且确保简单弧上除端点以外的内部点不被其他简单弧共享。简单弧划分方法见第7章线框架生成方法。

以上就是关于爱是什么样子的全部的内容,包括:爱是什么样子的、断面建模、常见的提高消隐算法效率的方法有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10123691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存