分享
 
 
 

位图波浪:Jeff Molofee(NeHe) 的 OPENGL 教程-第十一课

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Jeff Molofee(NeHe) 的 OPENGL 教程

第十一课

Translated by

CKER

大家好!对那些想知道我在这里作了些什么的朋友,您可以先按文章的末尾所列出的链接,下载我那毫无意义的Demo看看先!我是bosco,我将尽我所能教您来实现一个以正弦波方式运动的图象。这一课基于NeHe的教程第六课,当然您至少也应该学会了一至六课的知识。您需要下载源码压缩包,并将压缩包内带的data目录连其下的位图一起释放至您的代码目录下。或者使用您自己的位图,当然它的尺寸必须适合OpenGL纹理的要求。

在我们开始之前,先打开Visual C++『译者:我可是用的C++ Builder…J』并在其他的#inlude之后,添加如下的代码。这将引入我们在程序中将要用到的复杂『复杂吗?』数学函数sine和cosine。

#include <math.h> // 引入数学函数库中的Sin()

我们将使用points数组来存放网格各顶点独立的x,y,z坐标。这里网格由45×45点形成,换句话说也就是由44格×44格的小方格子依次组成了。wiggle_count用来指定纹理波浪的运动速度。每3帧一次看起来很不错,变量hold 将存放一个用来对旗形波浪进行光滑的浮点数。这几行添加在程序头部,位于最后一行#include之后、GLuint texture[1]之前的位置。

float points[ 45 ][ 45 ][3]; // Points 网格顶点数组

int wiggle_count = 0; // 指定旗形波浪的运动速度

GLfloat hold; // 临时变量

然后下移至LoadGLTextures()子过程。本课中使用的纹理文件名是Tim.bmp。找到LoadBMP("Data/NeHe.bmp")这一句,并用LoadBMP ("Data/Tim.bmp")替换它。

if (TextureImage[0]=LoadBMP("Data/Tim.bmp")) // 载入位图

接着在InitGL()函数的尾部 return TRUE 之前,添加如下的代码。

glPolygonMode( GL_BACK, GL_FILL ); // 后表面完全填充

glPolygonMode( GL_FRONT, GL_LINE ); // 前表面使用线条绘制

上面的代码指定使用完全填充模式来填充多边形区域的背面『或者叫做后表面吧』。相反,多边形的正面『前表面』则使用轮廓线填充了。这些方式完全取决于您的个人喜好。并且与多边形的方位或者顶点的方向有关。详情请参考Red Book。这里我顺便推销一本推动我学习OpenGL的好书-Addison-Wesley出版的《Programmer's Guide to OpenGL》。个人以为这是学习OpenGL的无价之宝。

接着上面的代码并在 return TRUE这一句之前, 添加如下的几行。

// 沿X平面循环

for(int x=0; x<45; x++)

{

// 沿Y平面循环

for(int y=0; y<45; y++)

{

// 向表面添加波浪效果

points[x][y][0]=float((x/5.0f)-4.5f);

points[x][y][1]=float((y/5.0f)-4.5f);

points[x][y][2]=float(sin((((x/5.0f)*40.0f)/360.0f)*3.141592654*2.0f)

}

}

这里感谢Graham Gibbons关于使用整数循环变量消除波浪间的脉冲锯齿的建议。

上面的两个循环初始化网格上的点。使用整数循环可以消除由于浮点运算取整造成的脉冲锯齿的出现。我们将x和y变量都除以5,再减去4.5。这样使得我们的波浪可以”居中”『这样计算所得结果将落在区间[-4.5,4.5]之间。』。

点[x][y][2]最后的值就是一个sine函数计算的结果。Sin()函数需要一个弧度参变量。将float_x乘以40.0f,得到角度值。然后除以360.0f再乘以PI,乘以2,就转换为弧度了。

接着我将彻底重写DrawGLScene函数。

int DrawGLScene(GLvoid) // Draw Our GL Scene

{

int x, y; // 循环变量

float float_x, float_y, float_xb, float_yb; // 用来将旗形的波浪分割成很小的四边形

我们使用不同的变量来控制循环。下面的代码中大多数变量除了用来控制循环和存储临时变量之外并没有什么别的用处。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓冲

glLoadIdentity(); // 重置当前的模型观察矩阵

glTranslatef(0.0f,0.0f,-12.0f); // 移入屏幕12个单位

glRotatef(xrot,1.0f,0.0f,0.0f); // 绕 X 轴旋转

glRotatef(yrot,0.0f,1.0f,0.0f); // 绕 Y 轴旋转

glRotatef(zrot,0.0f,0.0f,1.0f); // 绕 Z 轴旋转

glBindTexture(GL_TEXTURE_2D, texture[0]); // 选择纹理

正如您所见,上面的代码和第六课的很类似,唯一的区别就是我将场景挪的离镜头更远了一些。

glBegin(GL_QUADS); // 四边形绘制开始

for( x = 0; x < 44; x++ ) // 沿 X 平面 0-44 循环(45点)

{

for( y = 0; y < 44; y++ ) // 沿 Y 平面 0-44 循环(45点)

{

接着开始使用循环进行多边形绘制。这里使用整型可以避免我以前所用的int()强制类型转换。

float_x = float(x)/44.0f; // 生成X浮点值

float_y = float(y)/44.0f; //生成Y浮点值

float_xb = float(x+1)/44.0f; //X浮点值+0.0227f

float_yb = float(y+1)/44.0f; //Y浮点值+0.0227f

上面我们使用4个变量来存放纹理坐标。每个多边形(网格之间的四边形)分别映射了纹理的1/44 x 1/44部分。循环首先确定左下顶点的值,然后我们据此得到其他三点的值。

glTexCoord2f( float_x, float_y); // 第一个纹理坐标 (左下角)

glVertex3f( points[x][y][0], points[x][y][1], points[x][y][2] );

glTexCoord2f( float_x, float_yb ); // 第二个纹理坐标 (左上角)

glVertex3f( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2] )

glTexCoord2f( float_xb, float_yb ); //第三个纹理坐标 (右上角)

glVertex3f( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1

glTexCoord2f( float_xb, float_y ); // 第四个纹理坐标 (右下角)

glVertex3f( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2] )

}

}

glEnd(); // 四边形绘制结束

上面几行使用glTexCoord2f() 和 glVertex3f()载入数据。提醒一点:四边形是逆时针绘制的。这就是说,您开始所见到的表面是背面。后表面完全填充了,前表面由线条组成。

如果您按顺时针顺序绘制的话,您初始时见到的可能是前表面。也就是说您将看到网格型的纹理效果而不是完全填充的。

if( wiggle_count == 2 ) // 用来降低波浪速度(每隔2帧一次)

{

每绘制两次场景,循环一次sine值,以产生运动效果。

for( y = 0; y < 45; y++ ) // 沿Y平面循环

{

hold=points[0][y][2]; // 存储当前左侧波浪值

for( x = 0; x < 44; x++) // 沿X平面循环

{

// 当前波浪值等于其右侧的波浪值

points[x][y][2] = points[x+1][y][2];

}

points[44][y][2]=hold; // 刚才的值成为最左侧的波浪值

}

wiggle_count = 0; // 计数器清零

}

wiggle_count++; // 计数器加一

上面所作的事情是先存储每一行的第一个值,然后将波浪左移一下,是图象产生波浪。存储的数值挪到末端以产生一个永无尽头的波浪纹理效果。然后重置计数器 wiggle_count以保持动画的进行。

上面的代码由NeHe(2000年2月)修改过,以消除波浪间出现的细小锯齿。

xrot+=0.3f; // X 轴旋转

yrot+=0.2f; // Y 轴旋转

zrot+=0.4f; // Z 轴旋转

return TRUE; // 返回

}

标准的NeHe旋转增量:)。 现在编译并运行程序,您将看到一个漂亮的位图波浪。除了嘘声一片之外,我不敢确信大家的反应。但我希望大家能从这一课中学到点什么。如果您有任何问题或者需要澄清的地方,请随便联络我。感谢大家!

Bosco (bosco4@home.com)

* DOWNLOAD Visual C++ Code For This Lesson.

* DOWNLOAD Visual C++ / OpenIL Code For This Lesson. ( Conversion by Denton Woods )

* DOWNLOAD Visual Basic Code For This Lesson. ( Conversion by Ross Dawson )

* DOWNLOAD Cygwin (FREE Language) Code For This Lesson. ( Conversion by Stephan Ferraro )

* DOWNLOAD Irix Code For This Lesson. ( Conversion by Rob Fletcher )

* DOWNLOAD MacOS X/GLUT Code For This Lesson. ( Conversion by Raal Goff )

* DOWNLOAD MASM Code For This Lesson. ( Conversion by Nico (Scalp) )

* DOWNLOAD Linux Code For This Lesson. ( Conversion by Richard Campbell )

* DOWNLOAD Linux/GLX Code For This Lesson. ( Conversion by Mihael Vrbanec )

* DOWNLOAD Visual Fortran Code For This Lesson. ( Conversion by Jean-Philippe Perois )

* DOWNLOAD Delphi Code For This Lesson. ( Conversion by Marc Aarts )

* DOWNLOAD Mac OS Code For This Lesson. ( Conversion by Anthony Parker )

* DOWNLOAD Power Basic Code For This Lesson. ( Conversion by Angus Law )

* DOWNLOAD Java Code For This Lesson. ( Conversion by Darren Hodges )

* DOWNLOAD MingW32 & Allegro Code For This Lesson. ( Conversion by Peter Puck )

* DOWNLOAD Borland C++ Builder 4.0 Code For This Lesson. ( Conversion by Patrick Salmons )

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有