欢迎来到学术参考网

基于OpenGL 高仿真三维物体贴图技术研究

发布时间:2015-12-15 13:50

摘 要:现代的销售方式,越来越借助于高技术含量的计算机的手段,例如建材商品的销售活动,消费者往往犹豫商品的颜色和花纹是否和家里的氛围相协调,这阻碍了成交的顺利进行。为了解决这个问题,论文提出了用OPENGL进行高仿真三维物体,将这一物体搬到计算机上顾客虚拟的家里,这样就可以看到接近实际的效果了。论文着重介绍这一仿真技术中的一项关键技术—贴图技术。

关键词:OpenGL;高仿真;贴图技术
一 问题的提出
(1),营销手段的进步,对商品模拟软件的需求
  技术的发展已经慢慢进入了人们的生活,以前买东西,你可能在犹豫这个东西是否适合自己家的氛围,购买时犹豫不决,现在的营销模式改变了这一现状,很多厂家将三维仿真技术用到了商业促销上,提高了成交率。例如你要为自己家里选择木地板,但你不知道选择什么颜色和花纹适合自己家,商家通过计算机将铺装后的效果展现出来,供消费者决策。
(2),商品模拟软件开发可以使用OpenGL技术
  OpenGL技术完全可以胜任仿真物体的任务,OpenGL 是最早出现的图形接口标准,它以动态库的方式提供给软件开发者所有图形绘制接口函数。OpenGL易学易用,开发方便,本文重点就是讨论OpenGL技术中比较关键技术之一,即贴图技术,选用DELPHI 7做了演示程序。
二 相关概念和实现工具
(1),建模
  现实世界中,固体物体正常状态下都有固定的形状,仿真物体,首先要对物体建立模型,任何物体的表面都可以用无数个小三角形或者多边形去逼近,这些三角形和多边形都有各自的顶点坐标,根据这些坐标与OpenGL坐标系之间的对照关系,就可以将物体置放到虚拟世界中。
(2),OpenGL纹理与贴图
  现实世界中的物体表面往往有各种纹理,仿真时需要给物体加上纹理,同时结合光照和材质参数的设置,使物体看起来更真实。OpenGL编程的重点是图形的生成和如何逼近真实效果。纹理贴图技术贯穿于整个OpenGL技术体系纹理和贴图时两个并行的概念,物体有纹理,而纹理是通过贴图技术来实现的。 
(3),单片贴图和重复贴图
  贴图最基本的方式有两种,一种方式是单片贴图,比如对一扇门来讲,我们就应该用单片贴图方式。如果是目地板或者瓷砖,因为需要好多地板或者是瓷砖,就需要重复的贴图。贴图的方向需要注意,图片的顶点和物体的顶点要一一对应否则,图片就会颠倒,下图就是图片和物体表面顶点的对照关系。


                  图 1
(4),贴图的右手法则
  在实际的开发工程中,经常发现贴上去的图,无论如何显示不出来,坐标都是正确的,但是无论如何贴图无法显示。所以一定要注意贴图遵循右手法则:即面对你要观看的物体,深处右手,大拇指对向你的脸,手指的方向就是贴图的次序。
(5),阴影
  阴影的实现过程的操作可以说是一条深度比较指令。根据场景物体像素在光源视觉下的深度得到的阴影图,在视图转换阶段对应相机视觉中的像素判断是否属于阴影图中的像素,这本来就是一个TRUE OR FALSE的判断,若TRUE证明非阴影,像素颜色值不变;若FALSE则涂黑,以表明该处阴影,例如,当门打开时,我们需要实现阴影。或者当放置物体时,我们需要在地板或者地板瓷砖上建立阴影。
三,以家装中贴图为例,说明三维物体贴图技术具体实现过程
1, 编程实现贴图的一般过程
 (1),定义纹理
  有两种方法定义纹理:连续法和离散法。连续法把纹理定义为一个二元函数,函数的定义域就是纹理空间。而离散法则是把纹理定义在一个二维数组中,该数组表示纹理空间中行间隔和列间隔固定的一组网格点上的纹理值。网格点之间的其它点的纹理值可以通过对相邻网格点上纹理值进行插值来获得。通过纹理空间与物体空间之间的坐标变换,可以把纹理映射到物体表面。
 (2)纹理贴图方式
  OpenGL用于纹理贴图方式的函数为glTex~v(),该函数的原型(以glTexEnvf形式为例)为:voi  dglTexEnv(Gl_enum  target,Gl_enum  pname,GLfloat  param)其中target参数必须为GL_TEXTURE_ENV,pname参数必须为GL_TEXTURE_ENV_MODE,而参数parmn为GL_MODULATE、GL_DECAL或GL_BLEND。纹理坐标可以是1、2、3、4维的,通常用齐次坐标来表示,即(5,t,r,q)。OpenGL定义纹理坐标的函数为xCoord()。
2, 程序贴图后的效果


   
                                图 2
3,关键代码与技术
(1)建立模型。
  房屋的模型可以通过如下代码设置顶点坐标,与纹理坐标和顶点坐标对应。类似于如下代码实现。
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); 
glEnd();


(2)确保贴图不颠倒
  在程序中,窗户和门,墙壁,顶棚和地板都是通过绘制矩形的方式来实现的,然后对这个矩形四个顶点分别和纹理的四个顶点相对应,使图像能正常显示出来不会颠倒,具体形式如下。 
    glBegin(GL_POLYGON);
    【代码含义】定义及即将绘制矩形
  for F:=0 to FaceCount-1 do
    【代码含义】对三维物体中存在多少平面进行逐个处理
    for iVertex:=0 to 3 do
    【代码含义】对每个平米的四个坐标进行逐一的处理
    begin
        glNormal3f(Normals[iVertex].X, Normals[iVertex].Y, Normals[iVertex].Z);
    【代码含义】定义光照的法向量
        if ture then
   【代码含义】如果物体定义了贴图,则用下面的代码定义纹理的坐标
          glTexCoord2f(TexVerts[iVertex].X, TexVerts[iVertex].Y)
        else
    【代码含义】否则用下面的颜色代码,显示颜色。
          glColor(,, );
        glVertex3f(Verts[iVertex].X , Verts[iVertex].Y , Verts[iVertex].Z );
      end;
    glEnd;
      这里有三个OpenGL 的关键函数, glNormal3f,glTexCoord2f glVertex3f。
  分别定义了这个顶点的法向量位置,纹理坐标的位置,和顶点坐标。
如果法向量的位置设置错误,那么光照将不能很好的表现出贴图的效果,会使物体看上去没有真实的感觉。纹理坐标决定该坐标点对应于图片的哪个角。顶点坐标 就是物体的某个顶点的空间位置了。
(3) 重复和单片贴图技术实现。
  从上面的图片可以看到,地板和顶棚是采用了重复贴图而门和窗户使用了单片图贴图。对应于上面代码段的glTexCoord2f(TexVerts  . 电脑报, 2002 .

上一篇:Photoshop对文字设计的应用与探讨

下一篇:浅谈多媒体教学