SweetDream
高歌一壶新酿酒,醉抱青山不必归。
    当您想要使用一系列的数字来完美的表达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.模拟行走头部摆幅

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

if (walkbiasangle <= 1.0f)

{

    walkbiasangle = 359.0f;

}

else

{

    walkbiasangle-= 10;

}

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

 

3.文本文件的读取:

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

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.            漫游

通过让场景做出和预订镜头相反方向运动来模拟镜头的运动。参见Lesson 9

posted on 2006-02-22 18:05  SweetDream  阅读(364)  评论(0编辑  收藏  举报