Jeff Molofee(NeHe) 的 OPENGL 教程
第十课
Translated by
CKER
typedef struct tagSECTOR // 创建Sector区段结构
{
int numtriangles; // Sector中的三角形个数
TRIANGLE* triangle; // 指向三角数组的指针
} SECTOR; // 命名为SECTOR
typedef struct tagTRIANGLE // 创建Triangle三角形结构
{
VERTEX vertex[3]; // VERTEX矢量数组,大小为3
} TRIANGLE; // 命名为 TRIANGLE
typedef struct tagVERTEX // 创建Vertex顶点结构
{
float x, y, z; // 3D 坐标
float u, v; // 纹理坐标
} VERTEX; // 命名为VERTEX
问题是,怎样才能从文件中取得数据资料呢?首先,创建一个叫做SetupWorld()的新函数。把这个文件定义为filein,并且使用只读方式打开文件。我们必须在使用完毕之后关闭文件。大家一起来看看现在的代码:
// 先前的定义: char* worldfile = "dataworld.txt";
void SetupWorld() // 设置我们的世界
{
FILE *filein; // 工作文件
filein = fopen(worldfile, "rt"); // 打开文件
...
(读入数据资料)
...
fclose(filein); // 关闭文件
return; // 返回
}
张彩放 0573-6082032(H)
void readstr(FILE *f,char *string) // 读入一个字符串
{
do // 循环开始
{
fgets(string, 255, f); // 读入一行
} while ((string[0] == '/') || (string[0] == 'n')); // 考察是否有必要进行处理
return; // 返回
}
NUMPOLLIES n
int numtriangles; // 区段中的三角形数量
char oneline[255]; // 存储数据的字符串
...
readstr(filein,oneline); // 读入一行数据
sscanf(oneline, "NUMPOLLIES %dn", &numtriangles); // 读入三角形数量
// 先前的定义: SECTOR sector1;
char oneline[255]; // 存储数据的字符串
int numtriangles; // 区段的三角形数量
float x, y, z, u, v; // 3D 和 纹理坐标
...
sector1.triangle = new TRIANGLE[numtriangles]; // 为numtriangles个三角形分配内存并设定指针
sector1.numtriangles = numtriangles; // 定义区段1中的三角形数量
// 遍历区段中的每个三角形
for (int triloop = 0; triloop < numtriangles; triloop++) // 遍历所有的三角形
{
// 遍历三角形的每个顶点
for (int vertloop = 0; vertloop < 3; vertloop++) // 遍历所有的顶点
{
readstr(filein,oneline); // 读入一行数据
// 读入各自的顶点数据
sscanf(oneline, "%f %f %f %f %f", &x, &y, &z, &u, &v);
// 将顶点数据存入各自的顶点
sector1.triangle[triloop].vertex[vertloop].x = x; // 区段 1, 第 triloop 个三角形, 第 vertloop 个顶点, 值 x =x
sector1.triangle[triloop].vertex[vertloop].y = y; // 区段 1, 第 triloop 个三角形, 第 vertloop 个顶点, 值 y =y
sector1.triangle[triloop].vertex[vertloop].z = z; // 区段 1, 第 triloop 个三角形, 第 vertloop 个顶点, 值 z =z
sector1.triangle[triloop].vertex[vertloop].u = u; // 区段 1, 第 triloop 个三角形, 第 vertloop 个顶点, 值 u =u
sector1.triangle[triloop].vertex[vertloop].v = v; // 区段 1, 第 triloop 个三角形, 第 vertloop 个顶点, 值 e=v
}
}
X1 Y1 Z1 U1 V1
X2 Y2 Z2 U2 V2
X3 Y3 Z3 U3 V3
if (keys[VK_RIGHT]) 方向键按下了么?
{
yrot -= 1.5f; // 向左旋转场景
}
if (keys[VK_LEFT]) // 左方向键按下了么?
{
yrot += 1.5f; // 向右侧旋转场景
}
if (keys[VK_UP]) // 向上方向键按下了么?
{
xpos -= (float)sin(heading*piover180) * 0.05f; // 沿游戏者所在的X平面移动
zpos -= (float)cos(heading*piover180) * 0.05f; // 沿游戏者所在的Z平面移动
if (walkbiasangle >= 359.0f) // walkbiasangle>=359?
{
walkbiasangle = 0.0f; // 将 walkbiasangle 设为l 0
}
else // 否则
{
walkbiasangle+= 10; // 如果 walkbiasangle < 359 ,则增加 10
}
walkbias = (float)sin(walkbiasangle * piover180)/20.0f; // 使游戏者产生跳跃感
}
if (keys[VK_DOWN]) // 向下方向键按下了么?
{
xpos += (float)sin(heading*piover180) * 0.05f; // 沿游戏者所在的X平面移动
zpos += (float)cos(heading*piover180) * 0.05f; // 沿游戏者所在的Z平面移动
if (walkbiasangle <= 1.0f) // walkbiasangle<=1?
{
walkbiasangle = 359.0f; // 使 walkbiasangle 等于 359
}
else // 否则
{
walkbiasangle-= 10; // 如果 walkbiasangle > 1 减去 10
}
walkbias = (float)sin(walkbiasangle * piover180)/20.0f; // 使游戏者产生跳跃感
}
int DrawGLScene(GLvoid) // 绘制 OpenGL 场景
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除 场景 和 深度缓冲
glLoadidentity(); // 重置当前矩阵
GLfloat x_m, y_m, z_m, u_m, v_m; // 顶点的临时 X, Y, Z, U 和 V 的数值
GLfloat xtrans = -xpos; // 用于游戏者沿X轴平移时的大小
GLfloat ztrans = -zpos; // 用于游戏者沿Z轴平移时的大小
GLfloat ytrans = -walkbias-0.25f; // 用于头部的上下摆动
GLfloat sceneroty = 360.0f - yrot; // 位于游戏者方向的360度角
int numtriangles; // 保有三角形数量的整数
glRotatef(lookupdown,1.0f,0,0); // 上下旋转
glRotatef(sceneroty,0,1.0f,0); // 根据游戏者正面所对方向所作的旋转
glTranslatef(xtrans, ytrans, ztrans); // 以游戏者为中心的平移场景
glBindTexture(GL_TEXTURE_2D, texture[filter]); // 根据 filter 选择的纹理
numtriangles = sector1.numtriangles; // 取得Sector1的三角形数量
// 逐个处理三角形
for (int loop_m = 0; loop_m < numtriangles; loop_m++) // 遍历所有的三角形
{
glBegin(GL_TRIANGLES); // 开始绘制三角形
glNormal3f( 0.0f, 0.0f, 1.0f); // 指向前面的法线
x_m = sector1.triangle[loop_m].vertex[0].x; // 第一点的 X 分量
y_m = sector1.triangle[loop_m].vertex[0].y; // 第一点的 Y 分量
z_m = sector1.triangle[loop_m].vertex[0].z; // 第一点的 Z 分量
u_m = sector1.triangle[loop_m].vertex[0].u; // 第一点的 U 纹理坐标
v_m = sector1.triangle[loop_m].vertex[0].v; // 第一点的 V 纹理坐标
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m); // 设置纹理坐标和顶点
x_m = sector1.triangle[loop_m].vertex[1].x; // 第二点的 X 分量
y_m = sector1.triangle[loop_m].vertex[1].y; // 第二点的 Y 分量
z_m = sector1.triangle[loop_m].vertex[1].z; // 第二点的 Z 分量
u_m = sector1.triangle[loop_m].vertex[1].u; // 第二点的 U 纹理坐标
v_m = sector1.triangle[loop_m].vertex[1].v; // 第二点的 V 纹理坐标
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m); // 设置纹理坐标和顶点
x_m = sector1.triangle[loop_m].vertex[2].x; // 第三点的 X 分量
y_m = sector1.triangle[loop_m].vertex[2].y; // 第三点的 Y 分量
z_m = sector1.triangle[loop_m].vertex[2].z; // 第三点的 Z 分量
u_m = sector1.triangle[loop_m].vertex[2].u; // 第二点的 U 纹理坐标
v_m = sector1.triangle[loop_m].vertex[2].v; // 第二点的 V 纹理坐标
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m); // 设置纹理坐标和顶点
glEnd(); // 三角形绘制结束
}
return TRUE; // 返回
}
Lionel Brits
(βtelgeuse)
以下是源码的下载连接:
* 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 hotmail.com">Jarred Capellman )
* DOWNLOAD Visual Basic Code For This Lesson.
( Conversion by SCOgl@email.com">Ross Dawson )
* DOWNLOAD Cygwin (FREE Language) Code For This Lesson.
( Conversion by Stephan Ferraro )
* DOWNLOAD MASM Code For This Lesson.
( Conversion by Nico (Scalp) )
* DOWNLOAD Irix Code For This Lesson.
( Conversion by Rob Fletcher )
* DOWNLOAD Linuxglx/lesson10.tar.gz">Linux/GLX Code For This Lesson.
( Conversion by Mihael Vrbanec )
* DOWNLOAD Linux Code For This Lesson.
( Conversion by Richard Campbell )
* DOWNLOAD Visual Fortran Code For This Lesson.
( Conversion by Jean-Philippe Perois )
* DOWNLOAD Delphi/lesson10.zip">Delphi Code For This Lesson.
( Conversion by Marc Aarts )
* DOWNLOAD Mac OS Code For This Lesson.
( Conversion by ASP@usc.edu">Anthony Parker )
* DOWNLOAD Power Basic Code For This Lesson.
( Conversion by Angus Law )
* DOWNLOAD Java Code For This Lesson.
( Conversion by Darren Hodges )
* DOWNLOAD Netscape.net/zaqhaq/">MingW32 & Allegro Code For This Lesson.
( Conversion by Peter Puck )
* DOWNLOAD Borland C++ Builder 4.0 Code For This Lesson.
( Conversion by sf.edu">Patrick Salmons )
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10752019/viewspace-980021/ ,如需转载,请注明出处,否则将追究法律责任。