您的位置:首页 > 其它

NeHe_Lesson 10 基于文本文件的场景构造和漫游

2006-02-22 18:05 218 查看
当您想要使用一系列的数字来完美的表达3D环境时,随着环境复杂度的上升,这个工作的难度也会随之上升。出于这个原因,我们必须将数据归类,使其具有更多的可操作性风格。在程序清单头部出现了sector(区段)的定义。每个3D世界基本上可以看作是sector(区段)的集合。一个sector(区段)可以是一个房间、一个立方体、或者任意一个闭合的区间。
1.自定义数据结构

typedef struct tagSECTOR // 创建Sector区段结构

{

int numtriangles;  // Sector中的三角形个数

  TRIANGLE* triangle; // 指向三角数组的指针

} SECTOR;    // 命名为SECTOR

一个sector(区段)包含了一系列的多边形,所以下一个目标就是triangle(我们将只用三角形,这样写代码更容易些)。

typedef struct tagTRIANGLE  // 创建Triangle三角形结构

{

VERTEX vertex[3]; // VERTEX矢量数组,大小为3

} TRIANGLE; // 命名为 TRIANGLE

三角形本质上是由一些(两个以上)顶点组成的多边形,顶点同时也是我们的最基本的分类单位。顶点包含了OpenGL真正感兴趣的数据。我们用3D空间中的坐标值(x, y, z)以及它们的纹理坐标(u, v)来定义三角形的每个顶点。

typedef struct tagVERTEX // 创建Vertex顶点结构

{

float x, y, z; // 3D坐标

  float u, v;  // 纹理坐标

} VERTEX;   // 命名为VERTEX

2[/b].模拟行走头部摆幅[/b]

人在行走的时候头的摆动幅度walkbias可以通过以下代码模拟:

if (walkbiasangle <= 1.0f)

{

walkbiasangle = 359.0f;

}

else

{

walkbiasangle-= 10;

}

walkbias = (float)sin(walkbiasangle * piover180)/20.0f;

3[/b].文本文件的读取:[/b]

//从文件中读取一行有用的数据(非注释行,空行)

void readstr(FILE *f,char *string)

{

do

{

fgets(string, 255, f);//Get a string from a stream

} while ((string[0] == '/') || (string[0] == '\n'));

return;

}

库函数sscanf把读取得文本格式化成指定格式的数据:

int sscanf(

const char *buffer,

const char *format [,

argument ] ...

);

readstr(filein,oneline);

sscanf(oneline, "%f %f %f %f %f", &x, &y, &z, &u, &v);

一行的数据:-2.0 1.0 2.0 2.0 1.0//x,y,z,u,v

1. [/b]漫游

通过让场景做出和预订镜头相反方向运动来模拟镜头的运动。参见Lesson 9。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: