第10课:加载3D世界,并在其中漫游 (参照NeHe)
这次教程中,我将教大家如何加载一个3D世界,并在3D世界中漫游。这相较于我们只能创造一个旋转的立方体或一群星星时有很大的进步了,当然这节课代码难度不低,但也不会很难,只要你跟着我慢慢一步一步来。
一个3D世界当然不像我们之前那样,只要几个对象就搞定了,因此,我们会选择将3D环境用数据来表达,并存放在一个文本中。随着环境复杂度的上升,这个工作得难度也会随之上升。出于这个原因,我们必须将数据归类,使其具有更多的可操作性风格。后面程序中,我们会把3D世界看作是区段(sector)的集合。一个区段可以是一个房间、一个立方体或者任意一个闭合的空间。
程序运行时效果如下:
下面进入教程:
我们这次将在第01课的基础上修改代码,其中一些与前几课重复的地方我不作过多解释。首先打开myglwidget.h文件,将类声明更改如下:
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QWidget>
#include <QGLWidget>
typedef struct tagVERTEX //创建Vertex顶点结构体
{
float x, y, z; //3D坐标
float u, v; //纹理坐标
} VERTEX;
typedef struct tagTRIANGLE //创建Triangle三角形结构体
{
VERTEX vertexs[3]; //3个顶点构成一个Triangle
} TRIANGLE;
typedef struct tagSECTOR //创建Sector区段结构体
{
int numtriangles; //Sector中的三角形个数
QVector<TRIANGLE> vTriangle; //储存三角形的向量
} SECTOR;
class MyGLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
protected:
//对3个纯虚函数的重定义
void initializeGL();
void resizeGL(int w, int h);
void paintG