glVertex3d(X b, Y, Z);
glVertex3d(-X, Y, Z);
glEnd();
以上函数只是生成了一个面片,该面片在横向考虑了压痕线的存在,在生成整个纸盒
时,各个面片由于压痕线和纸厚影响的不同要进行不同的设置,最后利用平移函数根据各
个面片的相对位置将其放入一个栈中,即可生成一个三维纸盒。
3.纹理贴图功能的实现
生成纸盒的结构图后,虽然给其增加了光照,指定了材质,但是对物体表面材质的定
义仅仅局限于颜色的设定上。对真实物体而言,其材质不仅表现为光线反射特性,更重要的
是其表面的纹理特征,可以说纹理是区别材质最重要的因素之一。但是直接在物体表面绘制
纹理是很复杂的,
OpenGL 提供了一个方便的解决方法——纹理映射,即将扫描得到的真
实物体的纹理图形直接映射到场景中的物体表面,从而方便了真实物体纹理的模拟操作。
利用以上原理,我们可以将纸盒的装潢图案贴到物体表面,从而在纸盒
CAD 系统中生
成纸盒后,用户可以先观察纸盒的三维效果图,满意后再进行生产,从而节约成本。
纹理映射技术关键是定义纹理、指定纹理在像素上的应用方式及启用纹理。纹理的定义
可用如下函数实现:
void glTexImage2D(......);
该函数可以指定目标纹理、纹理的尺寸、边界宽度等。
定义了纹理之后,必须说明纹理在像素上的应用方式,该功能通过命令
glTexEnv*()来
实现,其参数决定了像素的最终
RGBA 质的计算方法。纹理在像素上的应用方式主要包括
贴花方式、调制方式和颜色混合模式。在光照下的纹理处理效果必须采用调制方式,因此调
制方式也是应用最多的纹理映射方式。
定义了纹理的映射方式后,纹理映射还需要启用才能作用于场景。纹理映射的启用和禁
用 是 通 过 命 令
glEnable() 和 glDisable() 实 现 的 。 对 于 一 维 纹 理 和 二 维 纹 理 采 用 参 数
GL_TEXTURE_1D 和 GL_TEXTURE_2D。
最后还需要指定纹理坐标和几何坐标,以确定纹理在物体上的粘贴位置和缠绕方式。对
于二维纹理图像来说,其纹理坐标沿两个方向的变化范围均为
0.0~1.0,图像四角的纹理
坐标分别为(
0.0, 0.0)、(0.0, 1.0)、(1.0, 1.0)和(1.0, 0.0),物体坐标则可以取任意值。
当纹理坐标对应于物体四角的几何坐标时,纹理图像恰好覆盖整个物体表面。但当物体太大
时,一般来说需要在物体表面进行纹理缠绕以覆盖整个表面。此时需注意的是纹理图像的左
右边缘和上下边缘应能够自然相接,这样才能使物体表面的纹理表现得比较自然。
纹理可以自动生成,也可以自由选择位图贴于物体表面。由于纸盒的装潢图案是任意的,
因此我们采用自由选择位图的方法。此时需要采用
Dib 类来打开一幅位图。但是位图的大小
必须是
2 的整数倍。
我们可以采用如下方式定义纹理控制滤波,说明纹理的映射方式,启用纹理。
定义纹理:
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height;
0,GL_BGR_EXT, GL_UNSIGNED_BYTE, pTextureBits);
控制纹理:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);