GEMINIGHT 警告:您的浏览器不支持JavaScript将无法正常浏览!
Warning: Your browser does not support JavaScript!
📋注册(Register) | 📛登录(Login)
🎲

主站(Home) »  论坛(Forum)  » 程序编写(Program)


自称:德菲力修士
注册于:2006年3月25日
等级:注册会员
帖子数:24
积分:146
阅读权限:20
[原创]GLM中文使用说明 1楼
Tags引力关联贴

/*
OBJ文件:
这里的OBJ文件是Wavefront公司的一种3D模型文件,不是VC在连接过程

\N

中产生的OBJ文件。GLM实现了用C语言对OBJ文件的常用操作,用于简单的3D游戏

\N

编程应该足够了。3DS MAX,MAYA都可以把模型以OBJ文件格式导出。OBJ文件中包

\N

含模型的顶点,面,三角形,法向,纹理坐标等数据,但是其中不包含纹理和材

\N

质。材质可以放在OBJ文件中指定一个材质库文件中,使用时材质库文件一般和

\N

OBJ文件放在一起。纹理图形就要自己想办法了。
*/

\N\N


//模型数据结构:
struct GLMmodel{
char* pathname; //模型文件和材质库的路径
char* mtllibname; //材质库名

\N

GLuint numvertices; //顶点数
GLfloat* vertices; //储存顶点的向量

GLuint numnormals; //模型法向数
GLfloat* normals; //储存法向的向量

\N

GLuint numtexcoords; //纹理坐标数
GLfloat* texcoords; //储存纹理坐标的向量

\N

GLuint numfacetnorms; //规则平面数
GLfloat* facetnorms; //储存规则平面的向量

\N

GLuint numtriangles; //三角形数
GLMtriangle* triangles; //储存三角形的向量

\N

GLuint nummaterials; //材质数
GLMmaterial* materials; //储存材质的向量

GLuint numgroups;//图元组数
GLMgroup* groups;//储存图元组的向量

\N

GLfloat position[3];//模型的位置

\N

//了解这个模型数据结构主要用于自己扩充操作,以下是glm提供的相关操作:

\N

//单位化模型model并返回缩放比例因子
//单位化就是把模型通过平移和缩放变换限制到3维坐标系中点为中心的一个单位

\N

正方体区域内
GLfloat glmUnitize(GLMmodel* model);

\N

//计算模型的宽,高,深尺寸,结果保存在dimensions所指的3元素数组中
GLvoid glmDimensions(GLMmodel* model, GLfloat* dimensions);

\N

//按比例参数缩放模型,参数大于1放大,大于0小于1缩小,小于0反射,等于0缩

\N

小到0
GLvoid glmScale(GLMmodel* model, GLfloat scale);

\N

//反转模型的多边形顶点顺序,同时反转法向量,默认多边形顶点顺序是逆时针

\N

的。
GLvoid glmReverseWinding(GLMmodel* model);

\N

//计算模型面的法向(假定多边形顶点顺序为逆时针)
GLvoid glmFacetNormals(GLMmodel* model);

\N

//计算模型的平滑顶点法向,angle参数为平滑交叉的最大角度(角度制)
GLvoid glmVertexNormals(GLMmodel* model, GLfloat angle);

\N

//按线性投影产生纹理坐标,它把顶点线性映射到矩形上
GLvoid glmLinearTexture(GLMmodel* model);

\N

//按球形映射产生纹理坐标
GLvoid glmSpheremapTexture(GLMmodel* model);

\N

//从内存中释放模型
GLvoid glmDelete(GLMmodel* model);

\N

//从Wavefront公司标准的.OBJ文件中读取模型
GLMmodel* glmReadOBJ(char* filename);

\N

//将模型按Wavefront .OBJ文件格式写入文件,文件名由filename参数指定
//mode指定写入方式,此参数为取或(“|”)的位联合:
//GLM_NONE - 只按顶点处理
//GLM_FLAT - 按面计算法向
//GLM_SMOOTH - 按顶点计算法向
//GLM_TEXTURE - 包含纹理座标
//GLM_COLOR - 只包含颜色信息(纯色材质)
//GLM_MATERIAL - 包含材质信息
//其中GLM_FLAT和GLM_SMOOTH不能同时指定
//GLM_COLOR和GLM_MATERIAL也不能同时指定
GLvoid glmWriteOBJ(GLMmodel* model, char* filename, GLuint mode);

\N

//按mode指定模式使用当前的OPENGL绘制上下文(context)绘制模型
//mode参数同glmReadOBJ中的mode参数
GLvoid glmDraw(GLMmodel* model, GLuint mode);

\N

//由模型生成OPENGL显示列表并返回显示列表索引号
//其中mode参数同glmWriteOBJ和glmDraw中的mode参数
GLuint glmList(GLMmodel* model, GLuint mode);

\N

//合并模型中差别很小的顶点,epsilon参数指定要合并顶点间的最大差距
//推荐epsilon参数0.00001为焊接模型的起点
GLvoid glmWeld(GLMmodel* model, GLfloat epsilon);

\N

//读取PPM格式的图形文件
//返回一个24位色的图象指针(可用于OPENGL纹理映射和图象绘制函数)
//同时图象尺寸存储在width,height指针参数指定的地址中
glmReadPPM(char* filename, int* width, int* height);

\N


//备注:本文主要根据GLM.H和GLM.C里的代码和注释和我的理解写成,很可能有不

\N

准确和不详尽之处,还请各位指正~ :b

SIGNATURE
在信息时代,所谓的障碍都是主观上的。如果你想动手开发什么全新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机,和为之献身的决心。我们在地板上睡过,我们从河水中趟过。 --Jhon Carmack
🗓2006-3-31 23:52(约18年前)  👁1542


自称:德菲力修士
注册于:2006年3月25日
等级:注册会员
帖子数:24
积分:146
阅读权限:20
2楼

\N

PPM图形文件格式:
包括两个部分,头部分和图象数据部分。头部分由三部分组成,这三部分由回车或换行分割,但PPM的标准中是要求空格。第一行通常是P3或P6,说明是PPM格式;第二行是图象的宽度和高度,用ASCII来表示;最后一部分是描述像素的最大颜色组成,这里允许描述超过一个字节(0-255)的颜色值。另外可以在上面个部分的后面用#来追加注释,注释行是从#到该行末。
下面是PPM头的例子:
例子1:
P6 1024 778 255
例子2:
P6
1024 778
255
例子3:
P6#PPM文件格式
1024 778#宽度和高度
# 注释
255

PPM图象数据的格式依赖于PPM自身的表示,如果是P3格式,数据将以ASCII文本来表示,每个像素的值从0到前面的最大值,每行不应该长于70个字符,如下:
例子4:
P3
# example from the man page
4 4
15
0 0 0 0 0 0 0 0 0 15 0 15
0 0 0 0 15 7 0 0 0 0 0 0
0 0 0 0 0 0 0 15 7 0 0 0
15 0 15 0 0 0 0 0 0 0 0 0

如果是P6格式,图象数据以字节格式存储,每个色彩成分(r,g,b)一个字节。仅仅在头部的最后一个字段的前面才能
有注释,在头部的最后一个字段后面通常是一个回车或换行。P6图象文件比P3文件小,读起来更快。注意,P6文件仅仅
用作但字节彩色。

但并没有按照格式规约的要求来,通常的习惯,图象从上到下,从左到右被存储。每个像素以一个字节来存储,0表示黑
色,255表示白色。色彩成分按照通常的红-绿-蓝顺序爱存储。

PGM
该格式文件存储灰度图形,也就是这里每个像素使用一个值来表示而不是3个(R,G,B)。同PPM唯一不同的是头部用P2和P5,分别表示用ASCII和字节码来表示数据。
例如:
P2
24 7
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0
0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0
0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

PBM
使用ASCII的0或1方式来表示数据,0表示白色,1表示黑色。与PPM、PGM不同的头部是少了第三行,因为第三行的最大色彩值在这个模式下已经没有意义了;如下:
P1
# PBM example
24 7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0
0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

[em01]
SIGNATURE
在信息时代,所谓的障碍都是主观上的。如果你想动手开发什么全新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机,和为之献身的决心。我们在地板上睡过,我们从河水中趟过。 --Jhon Carmack
🗓2006-3-31 23:54(约18年前)


自称:德菲力修士
注册于:2006年3月25日
等级:注册会员
帖子数:24
积分:146
阅读权限:20
3楼

[em01]

\N

鄙人初学OPENGL和3DS MAX目前只有精力搞这种稍微简单些的模型 各位可以尽情BS [em08]最近对其他稍强的读取复杂模型的范例性源代码疯狂饥渴中...有资料的一定SHARE IT WITH ME~~

[em06]
SIGNATURE
在信息时代,所谓的障碍都是主观上的。如果你想动手开发什么全新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机,和为之献身的决心。我们在地板上睡过,我们从河水中趟过。 --Jhon Carmack
🗓2006-4-1 00:05(约18年前)
Jeminai

自称:雙子騎士
注册于:2005年5月26日
等级:站长
帖子数:6428
积分:41808
阅读权限:200
4楼

这里:http://www.geminight.com/BBS/dispbbs.asp?boardID=14&ID=2201&star=2&page=1

\N

13楼,我给你的载入OBJ源码你受到没?

SIGNATURE
我的Blog网址:blog.geminight.com
🗓2006-4-1 09:51(约18年前)


自称:德菲力修士
注册于:2006年3月25日
等级:注册会员
帖子数:24
积分:146
阅读权限:20
5楼

看到了 那个源码限制面的顶点数[em06]我读个稍微大点的OBJ就不停的出错...

\N

感谢Jeminai 大大~

SIGNATURE
在信息时代,所谓的障碍都是主观上的。如果你想动手开发什么全新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机,和为之献身的决心。我们在地板上睡过,我们从河水中趟过。 --Jhon Carmack
🗓2006-4-1 10:00(约18年前)
Jeminai

自称:雙子騎士
注册于:2005年5月26日
等级:站长
帖子数:6428
积分:41808
阅读权限:200
6楼

[em09]是吗!

\N

别人的东西肯定不会如自己的意,完美的东西还是要靠自己不断的研究改进的、、、

SIGNATURE
我的Blog网址:blog.geminight.com
🗓2006-4-1 10:08(约18年前)

标题(Title):
关键字标签(Tags):
路人:回贴可以不必登录