田野考古中虚拟现实技术应用研究(五)

7. 引擎设计详解

 

 

 

三维引擎完成功能

 

 

 

a. 三位模型数据的读取;

 

 

 

b. 地层地貌数据的读取;

 

 

 

c. OpenGL平台绘制虚拟环境:灯光,雾;

 

 

 

d. OpenGL平台绘制三维物体,物体操作:平移,旋转,缩放,透明;

 

 

 

e. 漫游者设定:位置,眼睛方向,眼睛视角;

 

 

 

f. 漫游者变换:平移,自身旋转,抬头,低头,绕某一物体旋转;

 

 

 

g. 实现物体的表面贴图。

 

 

 

 

 

 

三维引擎结构图:

1

 

 

 

 

 

 

三维模型数据读取:C3DSReader

 

 

 

1. 3ds文件结构:注:3ds文件:

 

 

 

3ds文件是基于“块”存储的,这些块描述了诸如场景数据、每个编辑窗口(Viewport)的状态、材质、网格数据(课题组最关注的部分)等等数据。每个块都包含一个ID和块长度的块头。跟许多文件格式类似,为了读取的方便,3ds文件中数据的存储方式是Intel式的,也就是说是高位放在后面,低位放在前面。比如:网格块的块头ID0x4000在文件里是以00 40存放的,对于windows程序员来说,无需做任何转换。

 

 

 

 

 

 

每个块都以这样的块头开始:

 

 

 

   开始 结束 长度 作用

 

 

 

   0     1   2    块的ID

 

 

 

   2     5   4    该块的长度

 

 

 

  6…………………… 块数据

 

 

 

 

 

 

MAIN3DS  (0x4D4D)

 

 

 

                  |(注意,此处并不是紧接着EDIT块的,还有一些描述文件版本信息的块)

 

 

 

                  +--EDIT3DS  (0x3D3D)

 

 

 

                  |  |

 

 

 

                  |  +--EDIT_MATERIAL (0xAFFF)

 

 

 

                  |  |  |

 

 

 

                  |  |  +--MAT_NAME01 (0xA000) (See mli Doc) 

 

 

 

                  |  |

 

 

 

                  |  +--EDIT_CONFIG1  (0x0100)

 

 

 

                  |  +--EDIT_CONFIG2  (0x3E3D)

 

 

 

                  |  +--EDIT_VIEW_P1  (0x7012)

 

 

 

                  |  |  |

 

 

 

                  |  |  +--TOP            (0x0001)

 

 

 

                  |  |  +--BOTTOM         (0x0002)

 

 

 

                  |  |  +--LEFT           (0x0003)

 

 

 

                  |  |  +--RIGHT          (0x0004)

 

 

 

                  |  |  +--FRONT          (0x0005)

 

 

 

                  |  |  +--BACK           (0x0006)

 

 

 

                  |  |  +--USER           (0x0007)

 

 

 

                  |  |  +--CAMERA         (0xFFFF)

 

 

 

                  |  |  +--LIGHT          (0x0009)

 

 

 

                  |  |  +--DISABLED       (0x0010)

 

 

 

                  |  |  +--BOGUS          (0x0011)

 

 

 

                  |  |

 

 

 

                  |  +--EDIT_VIEW_P2  (0x7011)

 

 

 

                  |  |  |

 

 

 

                  |  |  +--TOP            (0x0001)

 

 

 

                  |  |  +--BOTTOM         (0x0002)

 

 

 

                  |  |  +--LEFT           (0x0003)

 

 

 

                  |  |  +--RIGHT          (0x0004)

 

 

 

                  |  |  +--FRONT          (0x0005)

 

 

 

                  |  |  +--BACK           (0x0006)

 

 

 

                  |  |  +--USER           (0x0007)

 

 

 

                  |  |  +--CAMERA         (0xFFFF)

 

 

 

                  |  |  +--LIGHT          (0x0009)

 

 

 

                  |  |  +--DISABLED       (0x0010)

 

 

 

                  |  |  +--BOGUS          (0x0011)

 

 

 

                  |  |

 

 

 

                  |  +--EDIT_VIEW_P3  (0x7020)

 

 

 

                  |  +--EDIT_VIEW1    (0x7001)

 

 

 

                  |  +--EDIT_BACKGR   (0x1200)

 

 

 

                  |  +--EDIT_AMBIENT  (0x2100)

 

 

 

                  |  +--EDIT_OBJECT   (0x4000)

 

 

 

                  |  |  |

 

 

 

                  |  |  +--OBJ_TRIMESH   (0x4100)

 

 

 

                  |  |  |  |

 

 

 

                  |  |  |  +--TRI_VERTEXL          (0x4110)

 

 

 

                  |  |  |  +--TRI_VERTEXOPTIONS    (0x4111)

 

 

 

                  |  |  |  +--TRI_MAPPINGCOORS     (0x4140) 

 

 

 

                  |  |  |  +--TRI_MAPPINGSTANDARD  (0x4170)

 

 

 

                  |  |  |  +--TRI_FACEL1           (0x4120)

 

 

 

                  |  |  |      |

 

 

 

          |  |  | +--TRI_SMOOTH           (0x4150)

 

 

 

                  |  |  |      +--TRI_MATERIAL     (0x4130)

 

 

 

                  |  |  |  

 

 

 

          |  |  |

 

 

 

                  |  |  |  +--TRI_LOCAL            (0x4160)

 

 

 

                  |  |  |  +--TRI_VISIBLE          (0x4165)

 

 

 

                  |  |  |

 

 

 

                  |  |  +--OBJ_LIGHT    (0x4600)

 

 

 

                  |  |  |  |

 

 

 

                  |  |  |  +--LIT_OFF              (0x4620)

 

 

 

                  |  |  |  +--LIT_SPOT             (0x4610)

 

 

 

                  |  |  |  +--LIT_UNKNWN01         (0x465A)

 

 

 

                  |  |  | 

 

 

 

                  |  |  +--OBJ_CAMERA   (0x4700)

 

 

 

                  |  |  |  |

 

 

 

                  |  |  |  +--CAM_UNKNWN01         (0x4710)

 

 

 

                  |  |  |  +--CAM_UNKNWN02         (0x4720) 

 

 

 

                  |  |  |

 

 

 

                  |  |  +--OBJ_UNKNWN01 (0x4710)

 

 

 

                  |  |  +--OBJ_UNKNWN02 (0x4720)

 

 

 

                  |  |

 

 

 

                  |  +--EDIT_UNKNW01  (0x1100)

 

 

 

                  |  +--EDIT_UNKNW02  (0x1201)

 

 

 

                  |  +--EDIT_UNKNW03  (0x1300)

 

 

 

                  |  +--EDIT_UNKNW04  (0x1400)

 

 

 

                  |  +--EDIT_UNKNW05  (0x1420)

 

 

 

                  |  +--EDIT_UNKNW06  (0x1450)

 

 

 

                  |  +--EDIT_UNKNW07  (0x1500)

 

 

 

                  |  +--EDIT_UNKNW08  (0x2200)

 

 

 

                  |  +--EDIT_UNKNW09  (0x2201)

 

 

 

                  |  +--EDIT_UNKNW10  (0x2210)

 

 

 

                  |  +--EDIT_UNKNW11  (0x2300)

 

 

 

                  |  +--EDIT_UNKNW12  (0x2302)

 

 

 

                  |  +--EDIT_UNKNW13  (0x2000)

 

 

 

                  |  +--EDIT_UNKNW14  (0xAFFF)

 

 

 

                  |

 

 

 

                  +--KEYF3DS (0xB000)

 

 

 

                     |

 

 

 

                     +--KEYF_UNKNWN01 (0xB00A)

 

 

 

                     +--............. (0x7001) 

                                          ( viewport, same as editor )

 

 

 

                     +--KEYF_FRAMES   (0xB008)

 

 

 

                     +--KEYF_UNKNWN02 (0xB009)

 

 

 

                     +--KEYF_OBJDES   (0xB002)

 

 

 

                        |

 

 

 

                        +--KEYF_OBJHIERARCH  (0xB010)

 

 

 

                        +--KEYF_OBJDUMMYNAME (0xB011)

 

 

 

                        +--KEYF_OBJUNKNWN01  (0xB013)

 

 

 

                        +--KEYF_OBJUNKNWN02  (0xB014)

 

 

 

                        +--KEYF_OBJUNKNWN03  (0xB015)

 

 

 

                        +--KEYF_OBJPIVOT     (0xB020)

 

 

 

                        +--KEYF_OBJUNKNWN04  (0xB021)

 

 

 

                        +--KEYF_OBJUNKNWN05  (0xB022)

 

 

 

另外还有一些块是在整个文件中都会经常出现的,那就是颜色块

COL_RGB1     0x0010      以float存放3个分量(这里的float是IEEE定义的float)

 

 

 

   COL_RGB2     0x0011  以char存放3个分量

   COL_RGB3     0x0012

      2. C3DSReader:负责3DS文件的读取工作,并将读入的数据按照特殊的规则保存到准备显示场景中的数据结构中。

 

class C3DSReader

{  

public: 

 

//读取3ds文件

bool Import3DS(t3DModel *pModel, const char *strFileName);

}  

 

函数名称

 

 

 

bool Import3DS(t3DModel *pModel, const char *strFileName)

 

 

 

功能描述

 

 

 

读取3ds文件数据到pModel

 

 

 

输入参数1

 

 

 

t3DModel *pModel:保存3ds数据内容的结构

 

 

 

输入参数2

 

 

 

const char *strFileName:读取的3ds文件的全路径名

 

 

 

返回值

 

 

 

True:读文件成功

 

 

 

False:读文件失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

C3DSReader类为准备保存3ds数据,定义了一些常量,数据结构和用来分析读入的模型数据的功能函数。

 

 

 

下面分别进行介绍

 

 

 

13DSReader类定义的常量:

 

 

 

编号

 

 

 

名称

 

 

 

 

 

 

意义

 

 

 

1

 

 

 

PRIMARY   

 

 

 

0x4D4D

 

 

 

主数据块的地址标记

 

 

 

2

 

 

 

OBJECTINFO

 

 

 

0x3D3D

 

 

 

对象数据块的地址标记

 

 

 

3

 

 

 

VERSION

 

 

 

0x0002

 

 

 

3ds文件版本标记

 

 

 

4

 

 

 

EDITKEYFRAME

 

 

 

0xB000

 

 

 

所有关键片段的地址标记

 

 

 

5

 

 

 

MATERIAL

 

 

 

0xAFFF

 

 

 

纹理信息的地址标记

 

 

 

6

 

 

 

OBJECT

 

 

 

0x4000

 

 

 

有关面,顶点等3D模型数据的地址标记

 

 

 

7

 

 

 

MATNAME

 

 

 

0xA000

 

 

 

材质名称的地址标记

 

 

 

8

 

 

 

MATAMBIENT

 

 

 

0xA010

 

 

 

同上

 

 

 

9

 

 

 

MATDIFFUSE

 

 

 

0xA020

 

 

 

模型和材质的颜色信息地址标记

 

 

 

10

 

 

 

MATSPECULAR

 

 

 

0xA030

 

 

 

同上

 

 

 

11

 

 

 

SHININESS

 

 

 

0xA040

 

 

 

同上

 

 

 

12

 

 

 

SHINSTRENGTH

 

 

 

0xA041

 

 

 

同上

 

 

 

13

 

 

 

MATMAP

 

 

 

0xA200

 

 

 

另一个材质的地址标记

 

 

 

14

 

 

 

MAT_MAP_SPECULAR

 

 

 

0xA204

 

 

 

同上

 

 

 

15

 

 

 

MAT_MAP_OPACITY

 

 

 

0xA210

 

 

 

同上

 

 

 

16

 

 

 

MAT_MAP_REFLECTION

 

 

 

0xA220

 

 

 

同上

 

 

 

17

 

 

 

MAT_MAP_BUMP

 

 

 

0xA230

 

 

 

同上

 

 

 

18

 

 

 

MAT_MAP_TEXTURE2

 

 

 

0xA33A

 

 

 

同上

 

 

 

19

 

 

 

MAT_MAP_SHININESS

 

 

 

0xA33C

 

 

 

同上

 

 

 

20

 

 

 

MAT_MAP_SELFILLUM

 

 

 

0xA33D

 

 

 

同上

 

 

 

21

 

 

 

MATMAPFILE

 

 

 

0xA300

 

 

 

纹理映射文件名的地址标记

 

 

 

22

 

 

 

MATMAPU_SCALE

 

 

 

0xA354

 

 

 

纹理映射坐标

 

 

 

23

 

 

 

MATMAPV_SCALE

 

 

 

0xA356

 

 

 

纹理映射坐标

 

 

 

24

 

 

 

MATMAPU_OFFSET

 

 

 

0xA358

 

 

 

纹理映射坐标

 

 

 

25

 

 

 

MATMAPV_OFFSET

 

 

 

0xA35A

 

 

 

纹理映射坐标

 

 

 

26

 

 

 

MATMAPROTATION

 

 

 

0xA35C

 

 

 

纹理映射坐标

 

 

 

27

 

 

 

OBJECT_MESH

 

 

 

0x4100

 

 

 

另一个新模型的地址标记

 

 

 

28

 

 

 

OBJECT_VERTICES

 

 

 

0x4110

 

 

 

模型顶点的地址标记

 

 

 

29

 

 

 

OBJECT_FACES

 

 

 

0x4120

 

 

 

模型面积的地址标记

 

 

 

30

 

 

 

OBJECT_MATERIAL

 

 

 

0x4130

 

 

 

模型是否有材质的标记

 

 

 

31

 

 

 

OBJECT_UV

 

 

 

0x4140

 

 

 

UV纹理坐标

 

 

 

32

 

 

 

MAX_TEXTURES

 

 

 

100

 

 

 

最大纹理数量

 

 

 

33

 

 

 

BMP_MODE

 

 

 

0

 

 

 

位图模式标志

 

 

 

34

 

 

 

JPG_MODE

 

 

 

1

 

 

 

JPG图片模式标志

 

 

 

35

 

 

 

GIF_MODE

 

 

 

2

 

 

 

GIF图片模式标志

 

 

 

36

 

 

 

TGA_MODE

 

 

 

3

 

 

 

TGA图片模式标志

 

 

 

 

 

 

23DSReader类定义的于3ds文件结构对应的数据结构

 

 

 

1. class CVector3 

 

 

 

{

 

 

 

public:

 

 

 

loat x, y, z;

 

 

 

};

 

 

 

结构名:CVector3

 

 

 

变量:x---X点坐标

 

 

 

y---Y点坐标

 

 

 

z---Z点坐标

 

 

 

 

 

 

2. class CVector2 

 

 

 

{

 

 

 

public:

 

 

 

loat x, y;

 

 

 

};

 

 

 

结构名:CVector2

 

 

 

变量:x---X点坐标

 

 

 

y---Y点坐标

 

 

 

 

 

 

3.struct tFace

 

 

 

{

 

 

 

int vertIndex[3];

 

 

 

int coordIndex[3];

 

 

 

short matIndex;

 

 

 

};

 

 

 

 

 

 

结构名:tFace

 

 

 

变量: vertIndex---一个三角形的顶点坐标

 

 

 

coordIndex---这个三角形的纹理贴图坐标

 

 

 

matIndex---材质索引

 

 

 

 

 

 

4. struct MAPPING

 

 

 

{

 

 

 

char filename[256];

 

 

 

short int   type,amount,options;

 

 

 

float filtering;

 

 

 

float u_scale,v_scale,u_offset,v_offset;

 

 

 

float rotation;

 

 

 

int piclibindx;

 

 

 

};

 

 

 

 

 

 

结构名: MAPPING

 

 

 

变量: filename---映射文件名

 

 

 

type,amount,options---映射类型映射数量映射选项.

 

 

 

Filtering---映射过滤值

 

 

 

u_scale,v_scale,u_offset,v_offset---U的缩放值, V的缩放值,U的位移,V的位移

 

 

 

rotation---映射的旋转值

 

 

 

piclibindx---图片索引

 

 

 

5. struct tMaterialInfo

 

 

 

{

 

 

 

char  strName[255];

 

 

 

char  strFile[255];

 

 

 

float  ambient[3];

 

 

 

float  diffuse[3];

 

 

 

float  specular[3];

 

 

 

float  shininess;

 

 

 

float  shinStrength;

 

 

 

int    texureId;

 

 

 

float  uScale;

 

 

 

float  vScale;

 

 

 

float  uOffset;

 

 

 

float  vOffset;

 

 

 

float  angle;

 

 

 

 

 

 

struct MAPPING 

 

 

 

map_texture1,

 

 

 

map_texture2,

 

 

 

map_opacity,map_bump,map_specular,

 

 

 

map_shininess,map_selfillum,map_reflection;

 

 

 

} ;

 

 

 

结构名: tMaterialInfo

 

 

 

变量:strName---纹理名称

 

 

 

strFile0---纹理文件名

 

 

 

ambient---纹理平行光颜色

 

 

 

diffuse---纹理反射光颜色

 

 

 

specular---纹理环境光颜色

 

 

 

shininess---纹理光强度

 

 

 

shinStrength---纹理光强度

 

 

 

texureId---纹理ID

 

 

 

uScale---U的缩放值

 

 

 

vScale---V的缩放值

 

 

 

uOffset---U的位移值

 

 

 

vOffset---V的位移值

 

 

 

angle---角度

 

 

 

一些映射变量1;

 

 

 

6. struct t3DObject 

 

 

 

{

 

 

 

int  numOfVerts;

 

 

 

int  numOfFaces;

 

 

 

int  numTexVertex;

 

 

 

int  materialID;

 

 

 

bool bHasTexture;     // This is TRUE if there is a texture map for this object

 

 

 

char strName[255]; // The name of the object

 

 

 

CVector3  *pVerts; // The object's vertices

 

 

 

CVector3  *pNormals; // The object's normals

 

 

 

CVector2  *pTexVerts; // The texture's UV coordinates

 

 

 

tFace *pFaces; // The faces information of the object

 

 

 

};

 

 

 

结构名: t3Dobject

 

 

 

变量: numOfVerts---模型中的点的数量

 

 

 

numOfFaces---模型中的面的数量

 

 

 

numTexVertex---纹理坐标的数量

 

 

 

materialID---纹理映射的ID

 

 

 

bHasTexture---如果这是一个用于映射这个对象就是TURE

 

 

 

strName---对象名称

 

 

 

pVerts---模型的顶点

 

 

 

pNormals---对象模型

 

 

 

pTexVerts---模型的UV坐标

 

 

 

pFaces---模型的面信息

 

 

 

 

 

 

7. struct t3DModel 

 

 

 

{

 

 

 

int numOfObjects;

 

 

 

int numOfMaterials;

 

 

 

CVector3 *pMaxCoordinate;

 

 

 

CVector3 *pMinCoordinate;

 

 

 

vector<tMaterialInfo> pMaterials;

 

 

 

vector<t3DObject> pObject;

 

 

 

};

 

 

 

结构名: t3Dmodel

 

 

 

变量: numOfObjects---模型中对象的数量

 

 

 

numOfMaterials---模型中材质的数量

 

 

 

pMaxCoordinate---最大坐标

 

 

 

pMinCoordinate---最小坐标

 

 

 

pMaterials---材质的列表

 

 

 

pObject---模型的对象列表

 

 

 

 

 

 

8. struct tIndices {

 

 

 

unsigned short a, b, c, bVisible;

 

 

 

};

 

 

 

结构名: tIndices

 

 

 

变量:a---A

 

 

 

b---点B

 

 

 

c---点C

 

 

 

bVisible---是否可见的标志

 

 

 

 

 

 

9. struct tChunk

 

 

 

{

 

 

 

unsigned short int ID;

 

 

 

unsigned int length;

 

 

 

unsigned int bytesRead;

 

 

 

};

 

 

 

结构名: tChunk

 

 

 

变量: ID---块的ID

 

 

 

length---块的长度

 

 

 

bytesRead---包含字节的数量

 

 

 

 

 

 

43DSReader类是专门为了读取由3DMax制做的3D模型文件.(.3DS文件).

 

 

 

3DMax是当前计算机领域中制作3维模型中主要制作工具,对于一个主要处理3D模型的软件提供对3DS文件的支持是必不可少的.

 

 

 

3DS文件的格式的版权是被3Dstudio公司所有的,由于该公司只公开了部分文件内容,因此如何能够尽可能多的了解3DS文件的内容是正确读取3D模型数据的关键。3DSReader类是尽课题组的力量将我们可能了解的3DS文件格式的内容进行了封装。基本可以实现:

 

 

 

a. 正确读取模型顶点数据

 

 

 

b. 正确读取模型贴图数据

 

 

 

c. 正确读取模型光照数据

 

 

 

d. 正确读取模型坐标数据

 

 

 

e. 正确读取模型大小数据

 

 

 

可以保证正常显示由用户制作好的3DS文件的内容。

 

 

 

 

 

 

地层地貌数据的读取:terrain2, CcultureTerrain

 

 

 

1. 地貌地层三维模型数据生成:terrain2

 

 

 

class terrain2 {

 

 

 

public:

 

 

 

 

 

 

class DataException {};

 

 

 

bool SetTerrainData(CultureData& culData);

 

 

 

void RenderTerrain(int render_layer);

 

 

 

void RenderTerrain();

 

 

 

int GetNumLayer();

 

 

 

void Clear();

 

 

 

 

 

 

}

 

 

 

 

 

 

Class DataException{}:处理测量数据发生异常的情况;

 

 

 

 

 

 

函数名称

 

 

 

bool SetTerrainData(CultureData& culData)

 

 

 

功能描述

 

 

 

加载地形地层的测量数据,利用分型算法,迭代细化每一个测量面,生成每个测量面的三维顶点数据,最后生成整体地形的三维顶点数据

 

 

 

输入参数1

 

 

 

CultureData& culData:地貌地层的测量数据

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:生成地貌地层的数据成功

 

 

 

False:生成地貌地层的数据失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

void RenderTerrain(int render_layer)

 

 

 

功能描述

 

 

 

绘制地貌地层

 

 

 

输入参数1

 

 

 

int render_layer:地层索引号

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

代码示例:

 

 

 

void terrain2::RenderLayer(int render_layer)

 

 

 

{

 

 

 

int k, i, j;

 

 

 

k = render_layer;

 

 

 

glColor3f(0.9f,0.9f,0.9f); //设定OpenGL窗体背景颜色

 

 

 

for (i=0; i<DX-1; ++i) //绘制地层顶点数据

 

 

 

{

 

 

 

for (j=0; j<DY-1; ++j)

 

 

 

{

 

 

 

if (p_layer[k].render_texture){

 

 

 

glEnable(GL_TEXTURE_2D);

 

 

 

glBindTexture(GL_TEXTURE_2D, p_layer[k].texture_id);

 

 

 

}

 

 

 

else glDisable(GL_TEXTURE_2D);

 

 

 

 

 

 

glBegin(GL_TRIANGLE_STRIP);     //开始绘制地层上表面四边形面

 

 

 

glNormal3fv(p_layer[k].AverNvs[i+1][j]);    //绘制四边形面第一个顶点法线

 

 

 

glTexCoord2f((float)(i+1)/DX, (float)j/DY);  //绘制四边形面第一个顶点纹理坐标

 

 

 

glVertex3f(p_layer[k].p_vertex[i+1][j].x, -p_layer[k].p_vertex[i+1][j].y, 

 

 

 

p_layer[k].p_vertex[i+1][j].z);    //绘制四边形面第一个顶点

 

 

 

 

 

 

//绘制四边形面第二个顶点

 

 

 

glNormal3fv(p_layer[k].AverNvs[i][j]);

 

 

 

glTexCoord2f((float)i/DX, (float)j/DY);

 

 

 

glVertex3f(p_layer[k].p_vertex[i][j].x, -p_layer[k].p_vertex[i][j].y, 

 

 

 

p_layer[k].p_vertex[i][j].z);

 

 

 

 

 

 

//绘制四边形面第三个顶点

 

 

 

glNormal3fv(p_layer[k].AverNvs[i+1][j+1]);

 

 

 

glTexCoord2f((float)(i+1)/DX, (float)(j+1)/DY);

 

 

 

glVertex3f(p_layer[k].p_vertex[i+1][j+1].x, -p_layer[k].p_vertex[i+1][j+1].y, 

 

 

 

p_layer[k].p_vertex[i+1][j+1].z);

 

 

 

 

 

 

//绘制四边形面第四个顶点

 

 

 

glNormal3fv(p_layer[k].AverNvs[i][j+1]);

 

 

 

glTexCoord2f((float)i/DX, (float)(j+1)/DY);

 

 

 

glVertex3f(p_layer[k].p_vertex[i][j+1].x, -p_layer[k].p_vertex[i][j+1].y, 

 

 

 

p_layer[k].p_vertex[i][j+1].z);

 

 

 

 

 

 

//开始绘制地层下表面四边形面

 

 

 

if (p_layer[k+1].render_texture){

 

 

 

glEnable(GL_TEXTURE_2D);

 

 

 

glBindTexture(GL_TEXTURE_2D, p_layer[k+1].texture_id);

 

 

 

}

 

 

 

else glDisable(GL_TEXTURE_2D);

 

 

 

glBegin(GL_TRIANGLE_STRIP);

 

 

 

 

 

 

glNormal3fv(p_layer[k+1].AverNvs[i][j]);

 

 

 

glTexCoord2f((float)i/DX, (float)j/DY);

 

 

 

glVertex3f(p_layer[k+1].p_vertex[i][j].x, -p_layer[k+1].p_vertex[i][j].y, 

 

 

 

p_layer[k+1].p_vertex[i][j].z);

 

 

 

 

 

 

glNormal3fv(p_layer[k+1].AverNvs[i+1][j]);

 

 

 

glTexCoord2f((float)(i+1)/DX, (float)j/DY);

 

 

 

glVertex3f(p_layer[k+1].p_vertex[i+1][j].x, -p_layer[k+1].p_vertex[i+1][j].y, 

 

 

 

p_layer[k+1].p_vertex[i+1][j].z);

 

 

 

 

 

 

glNormal3fv(p_layer[k+1].AverNvs[i][j+1]);

 

 

 

glTexCoord2f((float)i/DX, (float)(j+1)/DY);

 

 

 

glVertex3f(p_layer[k+1].p_vertex[i][j+1].x, -p_layer[k+1].p_vertex[i][j+1].y, 

 

 

 

p_layer[k+1].p_vertex[i][j+1].z);

 

 

 

 

 

 

glNormal3fv(p_layer[k+1].AverNvs[i+1][j+1]);

 

 

 

glTexCoord2f((float)(i+1)/DX, (float)(j+1)/DY);

 

 

 

glVertex3f(p_layer[k+1].p_vertex[i+1][j+1].x, -p_layer[k+1].p_vertex[i+1][j+1].y, 

 

 

 

p_layer[k+1].p_vertex[i+1][j+1].z);

 

 

 

glEnd(); //结束绘制

 

 

 

}

 

 

 

}

 

 

 

}

 

 

 

 

 

 

函数名称

 

 

 

void RenderTerrain()

 

 

 

功能描述

 

 

 

绘制整体的地貌地层

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

int GetNumLayer()

 

 

 

功能描述

 

 

 

获取当前地貌地层的地层数目

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

void Clear()

 

 

 

功能描述

 

 

 

清除当前地貌地层的内存数据

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

2. 地貌地层管理:CcultureTerrain:管理地貌地层的测量数据与对应的三维模型

 

 

 

class CCultureTerrain : public C3DObject  

 

 

 

{

 

 

 

public:

 

 

 

enum RenderMode { RENDER_UNITE, RENDER_SEPARATE };

 

 

 

 

 

 

//录入地貌地层的测量数据

 

 

 

bool SetCultureData(long _num_point, long _num_layer, float _length,

 

 

 

 float _width, int _unit, float _XCorner, float _YCorner);

 

 

 

//读取地貌地层测量数据的文件

 

 

 

bool Load3DFile( const char *strFileName );

 

 

 

//保存地貌地层测量数据

 

 

 

bool WriteCultureTerrain(const char* file, char* error);

 

 

 

//生成测量数据的三维地形

 

 

 

bool GenTerrain();

 

 

 

//清除测量数据

 

 

 

bool ClearCultureData();

 

 

 

//设定地层的绘制模式

 

 

 

void SetRenderUnite(bool unite);

 

 

 

//查看地层的绘制模式

 

 

 

bool IsRenderUnite();

 

 

 

//清除地层的三维数据

 

 

 

bool Clear();

 

 

 

//设定当前绘制的地层

 

 

 

bool SetRenderLayer(int layer);

 

 

 

 

 

 

//取得当前绘制的地层索引

 

 

 

int GetRenderLayer();

 

 

 

//取得当前地形的地层数目

 

 

 

int GetNumLayer();

 

 

 

//设定地形的表面贴图

 

 

 

bool SetTexture(CString filename);

 

 

 

 

 

 

}

 

 

 

函数名称

 

 

 

bool SetCultureData(long _num_point, long _num_layer, float _length,

 

 

 

             float _width, int _unit, float _XCorner, float _YCorner)

 

 

 

功能描述

 

 

 

录入地貌地层的测量数据

 

 

 

输入参数1

 

 

 

long _num_point:测量边上的顶点数目

 

 

 

输入参数2

 

 

 

long _num_layer:测量的地层数目

 

 

 

输入参数3

 

 

 

float _length:测量面的长度

 

 

 

输入参数4

 

 

 

float _width:测量面的宽度

 

 

 

输入参数5

 

 

 

int _unit:测量采取的单位:1:米;2:千米

 

 

 

输入参数6

 

 

 

float _Xcorner:测量面左下角顶点定义的x方向坐标值

 

 

 

输入参数7

 

 

 

float _YCorner:测量面左下角顶点定义的y方向坐标值

 

 

 

返回值

 

 

 

True:录入地貌地层的测量数据成功

 

 

 

False:录入地貌地层的测量数据失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool Load3DFile( const char *strFileName )

 

 

 

功能描述

 

 

 

读取地貌地层的测量数据文件

 

 

 

输入参数1

 

 

 

const char *strFileName:测量数据文件的全路径

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:读取成功

 

 

 

False:读取失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool WriteCultureTerrain(const char* file, char* error)

 

 

 

功能描述

 

 

 

保存地貌地层的测量数据到磁盘

 

 

 

输入参数1

 

 

 

const char* file:保存测量数据文件的全路径

 

 

 

输入参数2

 

 

 

char* error:保存过程中错误信息存储

 

 

 

返回值

 

 

 

True:写文件成功

 

 

 

False:写文件失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool GenTerrain()

 

 

 

功能描述

 

 

 

利用terrain2提供的算法生成测量数据的三维模型

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:生成三维模型成功

 

 

 

False:生成三维模型失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool ClearCultureData()

 

 

 

功能描述

 

 

 

清除当前内存中的测量数据

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:清除成功

 

 

 

False:清除失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

void SetRenderUnite(bool unite)

 

 

 

功能描述

 

 

 

设定地层的绘制模式

 

 

 

输入参数1

 

 

 

True:整体绘制

 

 

 

False:分层绘制

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool IsRenderUnite()

 

 

 

功能描述

 

 

 

查看地形绘制模式

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:整体绘制

 

 

 

False:分层绘制

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool Clear()

 

 

 

功能描述

 

 

 

清除当前地形的三维模型数据

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:清除成功

 

 

 

False:清除失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool SetRenderLayer(int layer)

 

 

 

功能描述

 

 

 

设定当前地形绘制的地层

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:设定成功

 

 

 

False:设定失败

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

int GetRenderLayer()

 

 

 

功能描述

 

 

 

得到当前地形绘制的地层索引

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

Int:分层绘制时被选中的地层索引

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

int GetNumLayer()

 

 

 

功能描述

 

 

 

取得当前地形的地层数目

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

Int:当前地形地层的数目 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

bool SetTexture(CString filename)

 

 

 

功能描述

 

 

 

设定地形的表面贴图

 

 

 

输入参数1

 

 

 

CString filename:贴图文件的全路径名

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

True:贴图成功

 

 

 

False:贴图失败 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

漫游者ClassCcamera完成功能:

 

 

 

设定漫游者位置,设定漫游者视角方向,获取漫游者位置;获取漫游者视角方向。

 

 

 

Ccamera:

 

 

 

class CCamera  

 

 

 

{

 

 

 

public:

 

 

 

 

 

 

void SetPosition(FLOATPOINT pos); //设定camera位置

 

 

 

void SetLookAt(FLOATPOINT look); //设定camera方向

 

 

 

void SetLookAngle(double a); //设定camera角度

 

 

 

 

 

 

FLOATPOINT GetPosition(void); //取得camera位置

 

 

 

FLOATPOINT GetLookAt(void);     //取得camera方向

 

 

 

double GetLookAngle(void); //取得camera角度

 

 

 

 

 

 

}

 

 

 

函数描述:

 

 

 

 

 

 

 

 

 

函数名称

 

 

 

void SetPosition(FLOATPOINT pos)

 

 

 

功能描述

 

 

 

设定漫游者当前观察的位置

 

 

 

输入参数1

 

 

 

FLOATPOINT pos:漫游者所在x,y,z三维方向的坐标值

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

void SetLookAt(FLOATPOINT look)

 

 

 

功能描述

 

 

 

设定漫游者当前观察的视点方向

 

 

 

输入参数1

 

 

 

FLOATPOINT look:视点指向的x,y,z三维方向的坐标值

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

void SetLookAngle(double a)

 

 

 

功能描述

 

 

 

设定漫游者当前观察的视角大小,最大值为180

 

 

 

输入参数1

 

 

 

double a:视角的数值

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

FLOATPOINT GetPosition(void)

 

 

 

功能描述

 

 

 

获取漫游者当前观察的位置

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

FLOATPOINT:漫游者所在x,y,z三维方向的坐标值

 

 

 

接口类型

 

 

 

公共接口

 

 

 

OpenGL绘制模型ClassCseneWnd完成功能:

 

 

 

管理场景的所有三维物体:向场景中添加物体,删除场景中的物体;

 

 

 

管理漫游者:漫游者平移,旋转处理;

 

 

 

管理三维环境绘制:灯光,雾;

 

 

 

 

 

 

 

1)管理场景的所有三维物体:

 

 

 

class CSceneWnd : public CWnd

 

 

 

{

 

 

 

public:

 

 

 

 

 

 

//添加3ds模型文件

 

 

 

C3DSModel* Add3DS(CString& file3ds);

 

 

 

//添加地貌地层地形文件

 

 

 

C3DObject* AddCulTerrain(CString& filename, int ID, int& num_member);

 

 

 

//删除场景中的地貌地层

 

 

 

void RemoveObject(CCultureTerrain* p_CulTerrain);

 

 

 

//删除场景中3ds模型

 

 

 

void RemoveObject(C3DSModel* p_3ds);

 

 

 

void ClearAll();  //删除场景中所有物体

 

 

 

void        HideAll();  //隐藏场景中所有物体

 

 

 

}

 

 

 

 

 

 

函数名称

 

 

 

FLOATPOINT GetLookAt(void)

 

 

 

功能描述

 

 

 

获取漫游者当前观察的视点方向

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

FLOATPOINT:视点指向的x,y,z三维方向的坐标值

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

double GetLookAngle(void)

 

 

 

功能描述

 

 

 

获取漫游者当前观察的视点方向

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

FLOATPOINT:漫游者视点观察的角度

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

C3DSModel* Add3DS(CString& file3ds)

 

 

 

功能描述

 

 

 

读取3ds模型数据文件并绘制

 

 

 

输入参数1

 

 

 

CString& file3ds3ds模型文件全路径名

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

C3DSModel*3ds模型内存数据指针

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

C3DObject* AddCulTerrain(CString& filename, int ID,

 

 

 

 int& num_member)

 

 

 

功能描述

 

 

 

添加文化地貌地层

 

 

 

输入参数1

 

 

 

CString& filename:地形文件全路径名

 

 

 

输入参数2

 

 

 

int ID:地形模型全局标识号

 

 

 

输入参数3

 

 

 

int& num_member:地层数目

 

 

 

返回值

 

 

 

C3DObject*:地形三位模型对象指针

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

Void  RemoveObject(CCultureTerrain* p_CulTerrain);

 

 

 

功能描述

 

 

 

删除场景中的文化地形

 

 

 

输入参数1

 

 

 

CCultureTerrain* p_CulTerrain:删除的模型指针

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

void RemoveObject(C3DSModel* p_3ds)

 

 

 

功能描述

 

 

 

删除场景中的物体

 

 

 

输入参数1

 

 

 

C3DSModel* p_3ds:删除物体的指针

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

2)管理漫游者:

 

 

 

public:

 

 

 

 

 

 

void SetCamera(CCamera * source);

 

 

 

CCamera* GetCamera();

 

 

 

 

 

 

 

 

 

函数名称

 

 

 

void ClearAll();

 

 

 

功能描述

 

 

 

清空场景众中的物体模型

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

void        HideAll();

 

 

 

功能描述

 

 

 

隐藏场景中的所有物体模型

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

3)管理三维环境绘制:灯光,雾

 

 

 

public:

 

 

 

 

 

 

void AddLight(CLight* light,int id);

 

 

 

void RemoveLight(int id);

 

 

 

 

 

 

函数名称

 

 

 

void SetCamera(CCamera * source);

 

 

 

功能描述

 

 

 

设定当前场景的漫游者

 

 

 

输入参数1

 

 

 

CCamera * source:漫游者对象指针

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

函数名称

 

 

 

CCamera* GetCamera();

 

 

 

功能描述

 

 

 

获取当前场景的漫游者对象指针

 

 

 

输入参数1

 

 

 

 

 

 

输入参数2

 

 

 

 

 

 

返回值

 

 

 

CCamera*:漫游者对象指针

 

 

 

接口类型

 

 

 

公共接口

 

 

 

 

 

 

 

 

 




[本日志由 张小朋 于 2010-04-19 11:55 AM 编辑]
文章来自: 本站原创
Tags: 考古 虚拟现实
评论: 0 | 查看次数: 3266
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 关闭 | [img]标签 关闭