【在线等!!!】用opengl画出obj文件

blackcat_king 2012-05-10 07:38:48
本来是要用opengl画出图的,但是我的obj导入后 是黑框啊。没图的!
虽然现在还没有导入颜色、纹理、那好歹应该有个白色的东西出来吧
现在什么都没有,也没报错
代码如下:

/*****************************loadOBJ.cpp*************************************/
#include<cstdlib>
#include "loadOBJ.h"
#include<fstream>
#include<sstream>
#include <iostream>
#include <glut.h>
#include <glew.h>
//#include"project1\main.h"

//#pragma warning(disable:4996)
using namespace std;


typedef struct Vertex{
float x,y,z;
struct Vertex *next;
}Vertex;

typedef struct Normal{
float x,y,z;
struct Normal *next;
}Normal;

typedef struct Face{
int vertIndex[3]; // 顶点索引
int coordIndex[3]; // 纹理坐标索引;
struct Face *next;
}Face;

loadOBJ::loadOBJ()
{
char c1,c2;
char Tem[256];

Vertex *Vf=new Vertex; //头指针
Normal *Nf=new Normal;
Face *Ff=new Face;
Vertex *V=Vf; //移动指针
Normal *N=Nf;
Face *F=Ff;
//float x,y,z;
//int vI[3],cI[3];
//vector<GLfloat> vec;
//GLuint vboId;
FILE *FilePointer;
//errno_t err;
//err=fopen_s(&FilePointer,"E:\\Foot.obj", "r");
freopen_s(&FilePointer,"cube.obj","rb",stdin);
//c1=getc(FilePointer);
while(!cin.eof()) //不是文件尾
{
cin>>c1; //读入每行第一个字符
switch(c1)
{
case '#': //文件信息 略过

break;
case'v': //点信息(要区分顶点 ("v")、法向量 ("vn")、纹理坐标 ("vt"))
cin.get(c2); //不跳过空格
switch(c2)
{
case' ':
V->next=new Vertex;
V=V->next;
cin>>V->x>>V->y>>V->z;
break;
case'n':
N->next=new Normal;
N=N->next;
cin>>N->x>>N->y>>N->z;
break;
case't':
//loadData(fileName,normals,normalId); //!!!!
break;
default:
break;
}

break;
case'f': //面信息 索引 f 1/1/1 2/2/2 3/3/3
F->next=new Face;
F=F->next;
cin>>F->vertIndex[0];
cin.get(); //读入 第一个“/”
cin>>F->coordIndex[0];
while(cin.get()!=' ') //寻找 空格
continue;
cin>>F->vertIndex[1];
cin.get();
cin>>F->coordIndex[1];
while(cin.get()!=' ')
continue;
cin>>F->vertIndex[2];
cin.get();
cin>>F->coordIndex[2];
break;
default: //略过该行

break;

}
cin.getline(Tem,256);
}
V->next=NULL;
N->next=NULL;
F->next=NULL;


V=Vf->next; //遍历
while(V!=NULL)
{
vertices.push_back(V->x);
vertices.push_back(V->y);
vertices.push_back(V->z);
V=V->next;
}


N=Nf->next; //遍历
while(N!=NULL)
{
normals.push_back(N->x);
normals.push_back(N->y);
normals.push_back(N->z);
N=N->next;
}


F=Ff->next; //遍历
while(F!=NULL)
{
for(int i=0;i<3;i++)
{
indexVer.push_back(F->vertIndex[i]);
indexTex.push_back(F->coordIndex[i]);
}
F=F->next;
}

delete F;
delete Ff;
delete N;
delete Nf;
delete V;
delete Vf;

glGenBuffers(1,&vetexId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vetexId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat),&vertices[0], GL_STATIC_DRAW_ARB);

glGenBuffers(1,&normalId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,normalId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, normals.size()*sizeof(GLfloat),&normals[0], GL_STATIC_DRAW_ARB);

glGenBuffers(1,&indexId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexVer.size()*sizeof(GLbyte),&indexVer[0], GL_STATIC_DRAW_ARB);

}


loadOBJ::~loadOBJ(void)
{
glDeleteBuffers(1,&vetexId);
glDeleteBuffers(1,&normalId);
//glDeleteBuffers(1,&colorId);
glDeleteBuffers(1,&indexId);
}

void loadOBJ::draw()
{
glEnableClientState(GL_NORMAL_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
//加载顶点
glBindBuffer(GL_ARRAY_BUFFER, vetexId);
glVertexPointer(3, GL_FLOAT, 0, 0);
//加载颜色
/*glBindBuffer(GL_ARRAY_BUFFER, colorId);
glColorPointer(3, GL_FLOAT, 0, 0);*/
//加载法线
glBindBuffer(GL_ARRAY_BUFFER, normalId);
glNormalPointer(GL_FLOAT, 0, 0);
//加载索引
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
glDrawElements(GL_QUADS, indexVer.size(), GL_UNSIGNED_INT, 0);
//glDrawArrays(GL_QUADS,0,vertices.size());

glDisableClientState(GL_VERTEX_ARRAY);
//glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}

/********************************* mian.cpp **************************************/


/************************************************************************/
/* 演示用类封装VBO,以及从文件加载数据 */
/************************************************************************/
//#include<cstdlib>
#include<iostream>
#include<glew.h>
#include <glut.h>
#include <ctime>
#include"loadOBJ.h"
using namespace std;
loadOBJ *obj; //定义为指针,暂不创建
double xAngle=0;
double yAngle=0;
time_t start=0; //开始时间
time_t End=0;//结束时间
int frame=0; //2秒以内的刷新的帧数
void computeFPS()
{
frame++;
time(&End);
int elapsed=End-start;//经过的时间
if(elapsed>=2)
{
cout<<"Frame per second(FPS):"<<(frame/elapsed)<<endl;
frame=0;
time(&start);
}
}
void display(void)
{
computeFPS(); //计算每秒帧数
glClear (GL_COLOR_BUFFER_BIT);//清除颜色缓冲
glMatrixMode(GL_MODELVIEW);//当前矩阵为模型视图矩阵
glLoadIdentity();//将矩阵初始化为单位矩阵
gluLookAt(0,0,5,0,0,0,0,1,0);
glRotated(xAngle,1,0,0);//绕(1,0,0)旋转
glRotated(yAngle,0,1,0);//绕(0,1,0)旋转
obj->draw(); //应用class 画图
glutSwapBuffers();

}
void init (void)
{

glClearColor (0.0, 0.0, 0.0, 0.0);//设置背景为黑色
glMatrixMode(GL_PROJECTION);//当前矩阵为投影矩阵
glLoadIdentity();//将矩阵初始化为单位矩阵

obj= new loadOBJ(); //初始化后创建
}
void reshape(int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);//设置显示大小,w是窗体的宽,h是窗体的高
glMatrixMode(GL_PROJECTION);//当前矩阵为投影矩阵
glLoadIdentity();//将矩阵初始化为单位矩阵
gluPerspective(60,w/h,1,100);
glMatrixMode(GL_MODELVIEW);//当前矩阵为模型视图矩阵
glLoadIdentity();//将矩阵初始化为单位矩阵
gluLookAt(0,0,5,0,0,0,0,1,0);
}
void keydown(unsigned char key,int mouseX, int mouseY)
{
switch (key)
{

case 'w':
xAngle++;
break;
case 's':
xAngle--;
break;
case 'a':
yAngle--;
break;
case 'd':
yAngle++;
break;
}
glutPostRedisplay(); //重绘3d图形
}
int main(int argc, char** argv)
{
glutInit(&argc, argv); //初始化
glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL);//设置OpenGL的显示模式
glutInitWindowSize (250, 250);//设置窗口大小
glutInitWindowPosition (100, 100);//设置窗口位置
glutCreateWindow ("example_7");//创建窗口
glewInit();//初始化glew
//glutFullScreen();
init();//初始化OpenGL
glutReshapeFunc(reshape);//设置窗体大小改变函数
glutDisplayFunc(display);//设置显示函数
glutIdleFunc( display ); //空闲时调用display
glutKeyboardFunc(keydown);//设置键盘响应函数
glutMainLoop();//开始消息循环
return 0;
}
...全文
479 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
柱柱快跑 2012-12-06
  • 打赏
  • 举报
回复
楼主能不能把完整代码发上来。。。我也在写,想借鉴一下
  • 打赏
  • 举报
回复
opengl本来就很麻烦 建议使用osg

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧