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。
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。
相关文章推荐
- 基于OGRE的3D的虚拟场景漫游系统(Visual_WEB3D)
- [OpenGL]基于AABB包围盒的漫游时视点与场景的碰撞检测
- 基于SketchUp和Unity3D的虚拟场景漫游和场景互动
- NeHe OpenGL Lesson 10 – Loading And Moving Through A 3D World
- 基于RLE的图片漫游方法
- 基于事件驱动的领域模型实现框架 - 分析框架如何解决各种典型业务逻辑场景
- Unity3d游戏开发之漫游场景的制作
- 基于A*算法10*10迷宫
- 密文策略基于属性加密(CP-ABE)访问树构造与解密
- 基于OpenCV的视频图像组态 (10): CEF浏览器与图形软件互嵌
- 利用rand7()构造rand10()
- LUA脚本调用C场景,使用C API访问脚本构造的表
- NeHe OpenGL lesson 7
- 【Qt OpenGL教程】10:加载3D世界,并在其中漫游
- 基于树莓派的微型气象站设计与开发(Windows 10 IoT Core)
- 用MyEclipse10开发基于JAX-WS的Web Service实例
- NeHe_Lesson 12 显示列表 (Display Lists)
- IP问问:从无到有——一种基于IP地址定位的位置|场景营销技术
- DeepLearning(基于caffe)实战项目(10)--Python编写网络配置文件
- 基于缓冲字符输入输出流复制文本文件