APP下载

纹理映射在物体重建中的应用

2015-03-03杜丽美

关键词:纹理物体定义

杜丽美

(长治学院 计算机系,山西 长治 046011)

纹理映射在物体重建中的应用

杜丽美

(长治学院 计算机系,山西 长治 046011)

基于给定的三维物体模型,研究如何使用OpenGL中的纹理映射函数,使得将纹理图像完美地映射到三维物体表面,进而模拟出真实物体的面貌.此过程的核心问题是研究OpenGL中的纹理定义函数,纹理控制函数,纹理坐标函数等的使用.

纹理定义;纹理控制;纹理坐标

0 引言

在当今的网络时代下,大家可以借助计算机来满足自己的各种需求,比如在工作、生活、科学研究上都要用到计算机,同样计算机因其自身功能的强大,也可以为大家解决各种难题.

三维重建是目前研究的众多热点问题中的一个,比如,在工业生产中,可以先将设想中的某个部件在计算机上重建出来,然后对此虚拟部件进行各种参数的修改,最终得到该虚拟部件的各项参数的准确数据,进而投入生产.在医学上三维重建技术也有相当重要的应用.除此之外,大多数人对计算机视觉的要求越来越强烈,如何将现实生活中的物体形象地表现在计算机屏幕上,这是当下的热门问题,此过程可以借助OpenGL函数中的光照、材质、雾化等效果函数来渲染出真实的环境效果,但是真实物体表面的颜色往往是千变万化非常复杂的,单用某些颜色函数往往是不够的,基于这种情况,OpenGL函数中提供了纹理函数,借助纹理函数就可以简单、方便地在计算机屏幕上形象地模拟出真实的物体和真实的环境效果了[1,2].

1 纹理映射简介及原理

纹理映射就是将现有的(或自己定义的)纹理图像映射到指定的区域上,使该区域具有与纹理图像一样的外貌.通俗来说,就是将现有的一幅图粘贴到预先构造的三维物体表面上,进而来增强三维物体的真实感.

在纹理映射中,所使用的纹理图像可以是自己定义的一副一维或二维图像,也可以是现有的一副一维或二维图像.在纹理图像粘贴到三维物体表面上时,所采用的映射方式最简单的是坐标对坐标的方式,但是在映射的实际过程中,由于三维物体表面可能是凹凸不平的,或者纹理图像和三维物体表面的大小是不一样的,因此在映射过程中就不能只是简单的映射形式,而是必须根据实际需要将纹理图进行适当的拉伸、压缩等变换,这样映射后的结果才具有真实感[3-5].下面将要介绍的纹理控制函数就可以解决此问题.

图1中的两幅图就是进行纹理映射后最终的效果,1(a)中分别对地面和左右的墙面进行纹理映射,而且为了增强真实感,还用了光照和雾化函数来渲染效果.图1(b).

为将自己定义的简单的纹理图像映射到曲面上的效果.由图1中的两种结果来看,纹理映射不仅适用于平面也可以应用到曲面上.

图1 纹理映射效果

2 纹理映射函数

进行纹理映射的一般过程是:首先最重要的是必须先定义一幅纹理图像,然后选择纹理控制函数说明映射方式,其次选择映射方式(即纹理图像上的颜色是否要和三维物体表面上的颜色进行混合),最后使用纹理坐标函数来完成映射.这几个过程所对的函数的具体用法将在下文以下几个小节中详细介绍.

2.1 纹理函数

一般来说纹理有一维和二维之分,但是通常用到的是二维纹理,因此这里只介绍二维纹理所对的函数[6]:

glTexImage2D(GLenum target, Glint level, Glint components, GLsizei width,

GLsizei height, Glint border, GLenum format, GLenum type, const GLvoid *pixels)

因为是二维纹理,所以此函数中的第一个参数取常数GL_TEXTURE_2D表明定义的二维纹理;第二个参数level表示纹理图像的分辨率级数,若只有一种分辨率则为0;第三个参数components的值一般取3,表示此纹理图像是由R,G,B三个分量混合而成;第四和第五个参数width和height是定义此二维纹理图像的大小(长和宽);如果此纹理图像有边界则由第六个参数border来定义,若没有边界,则此参数取0;第七个参数format一般取GL_RGB表示纹理映射的格式;第八个参数type通常取GL_UNSIGED_BYTE表示纹理映射的数据类型;第九个参数*pixels指向具体的纹理图像数据.

2.2 纹理控制函数

一张纹理图像一般是规则的长方形或正方形区域,若将这张纹理图像映射到一个凹凸不平的三维物体上时,可能此纹理图像要随着三维物体表面的凹凸形状来变化,或者纹理图像尺寸小于或大于三维物体表面的尺寸时,还要将纹理图像进行拉伸或压缩变换,这些情况就要借助本小节的纹理控制函数来实现,所对函数如下[6]:

glTexParameteri(GLenum target, GLenum pname, TYPE param)

该函数中各参数的意义及取值为:第一个参数为常数GL_TEXTURE_1D或GL_TEXTURE_2D,后两个参数的取值见表1所示.

表1 各参数的取值

参数GL_TEXTURE_MAG_FILTER和GL_TEXTURE_MIN_FILTER表示对纹理图像进行放大和缩小变换,对应的值GL_NEAREST和GL_LINEAR表示如何进行放大和缩小,其中GL_NEAREST表示纹理映射图像以中心位置为支点来进行放大和缩小,GL_LINEAR表示使用线性插值的方法对纹理图像进行放大和缩小.参数GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T表示纹理在X方向和Y方向上的延展,取值GL_CLAMP表示只延展纹理图像的边界像素值,GL_REPEAT表示重复延展整个纹理图像.

2.3 映射方式

一般情况下,三维物体通过设置光照表面会有某种颜色,如果将一张纹理映射图像直接映射到此三维物体上,要考虑的问题是纹理图像上的颜色是否要和此物体表面上的颜色进行混合,此过程所涉及的函数为[6]:

glTexEnvf(GLenum target,GLenum pname,TYPE param)

此函数的第一个参数target的值取GL_TEXTURE_ENV,第二个参数pname一般取GL-TEXTURE-ENV-MODE,参数pname所对的第三个参数param一般取GL-DECAL、GL-MODULATE或GL-BLEND表明怎样进行混合,GL-DECAL模式下所有的效果都将取消,物体表面只显示纹理颜色;GL-MODULATE模式下会根据当前的纹理颜色来调整物体表面的光照和明暗;GL-BLEND模式是将纹理颜色与光照颜色混合.

2.4 纹理坐标函数

纹理坐标函数为[6]:

glTexCoord2f(GLfloats,GLfloat t)

该函数中第一个参数s表示X轴方向上的坐标,第二个参数t表示Y轴方向上的坐标,X、Y轴上的坐标(s,t)表示纹理图像上的相应位置,比如(0,0)表示纹理图像上的左上点位置,(1,1)表示纹理图像上的右下点位置,(0,1)表示纹理图像上的左边界的中间位置等等.当把纹理图像粘贴到三维物体上时,要保证纹理图像上的点正确地映射到三维物体的对应位置上,如果映射错误,则会产生纹理图像颠倒或变形的可能.一般在进行纹理映射时,纹理坐标和三维物体的对应坐标要配对出现.

2.5 其他一些函数

以上是进行纹理映射过程中必不可少的四个步骤,当然在进行纹理映射的过程中可能还要用到其他一些函数,本小节再简要地介绍两个函数.

glGenTexture(GLsizein,GLuint*textures)

该函数中的第一个参数n表示将要使用的纹理图像的数量,第二个参数*textures表示指向这n个纹理图像的指针,初始状态下指向第一幅纹理图像.通俗地说此函数表示生成n个纹理图像并使用指针指向这n个纹理.

glBindTexture(GLenum target,GLuint texture)

该函数中的参数target同样可以取GL_TEXTURE_1D或GL_TEXTURE_2D;参数texture表示选取特定的纹理,它的选取数量取决于函数glGenTexture中定义的纹理图像的数量,通常函数glGenTexture与glBindTexture配合使用.

3 试验结果

借助以上函数,可以对不同的三维物体进行纹理映射,图2中的(a)(b)为将自定义的纹理图像映射到相应物体上的结果,其中图2(a)为将纹理图像映射到二维空间中的矩形物体上的结果,图2(b)为将同样的纹理图像映射到三维空间中的矩形物体上的结果;图2(c)为将现有的一副纹理图片分别映射到三维立方体的六个面上的结果.

图2 纹理映射结果

4 小结

本文主要介绍了OpenGL中的有关纹理函数的使用方法,其中纹理定义函数、纹理控制函数、纹理坐标函数是重点,它们决定着整个纹理映射工作的成败,通过实验结果分析发现纹理映射可以在计算机中完美地重现真实物体的面貌,而且操作简单,容易上手,因此纹理映射过程是进行三维物体重建过程中的重要阶段.

[1] 薛 安,马霭乃,李天宏.基于OpenGL实现真实感地形表现的研究[J].中国图像图形学报,2001,6(8):800-805

[2] 范 波,吴慧中.多面体表面纹理映射方法的研究[J].计算机研究与发展,1999,36(04):446-450

[3] 郭 玲,王建宇等.真实感3D重建中的纹理映射技术[J].中国图像图形学报,2007,12(10):1881-1884

[4] 段晓娟.基于OpenGL的纹理映射技术[J].长沙大学学报,2000,14(4):40-41

[5] 禹仁贵,任 磊,王 宁.基于OpenGL的纹理映射的实现与应用[J].西南民族大学学报(自然科学版),2008,34(6):1261-1263

[6] 廖朵朵.OpenGL变换、光照、纹理、动画及特殊效果[J].微电脑世界,1996(11):151-153

The Applications in the Reconstruction of Texture Mapping

DU Limei

(Department of Computer Science Changzhi University, Changzhi 046011, China)

Given three-dimensional object model, Research on how to use the OpenGL texture mapping function, So that the texture image is mapped to the three-dimensional surface perfectly, And then simulate the appearance of real objects.The problem with this process is mainly research the Texture-defined functions, Texture-controlled functions, Texture-coordinated functions which are in the OpenGL.

texture-defined function;texture-controlled function;texture-coordinated function

2015-10-21 基金项目:长治学院校级科研课题(201419).

杜丽美(1983-),女,山西大同人,硕士,长治学院计算机系讲师,主要从事计算机图形学、图像处理等研究.

1672-2027(2015)04-0054-04

TP391.41

A

猜你喜欢

纹理物体定义
基于BM3D的复杂纹理区域图像去噪
深刻理解物体的平衡
使用纹理叠加添加艺术画特效
我们是怎样看到物体的
TEXTURE ON TEXTURE质地上的纹理
消除凹凸纹理有妙招!
成功的定义
为什么同一物体在世界各地重量不一样?
修辞学的重大定义
悬浮的鸡蛋