VC读取obj文件的详细代码

qq_24329563 2016-04-09 11:31:23
// ReadObj_win32.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include<string>
#include<fstream>
#include<sstream>
#include <GL/glut.h>
using namespace std;

int v_num=0; //记录点的数量
int f_num=0; //记录面的数量
GLfloat **vArr; //存放点的二维数组
int **fArr; //存放面的二维数组
char s1;
GLfloat f2,f3,f4;
GLfloat x_scale=1.0,y_scale=1.0,z_scale=1.0;
static GLfloat rotateAngle = 0.0;
float a=0.8/3.0;

void TimeFun(int n);//声明
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
//glColor3f(1.0f,0.0f,0.0f); // 设置当前色为红色
glShadeModel(GL_SMOOTH);//选择过渡效果,则两点之间的颜色依次过渡
glutTimerFunc(10,TimeFun,0);

}

GLfloat color[13][3]={
{1.0,0.0,0.0},//red
{2,1.0,0.0},//between red and yellow洋红色
{1.0,1.0,0.0},//yellow
{0.0,1.0,0.0},//green
{0.0,1.0,0.0},//green
{0.0,2.0,1.0},
{0.0,1.0,1.0},//between green and blue——青色
{0.0,0.0,1.0},//blue
{0.0,0.0,1.0},//blue
{1.0,0.0,2.0},
{1.0,0.0,1.0},//purple
{1.0,0.0,0.0},//red
{1.0,0.0,0.0},//red
};
GLfloat position[13][3]={
{0,0.5,0.5},
{-a/2,0.3,0.5},
{-0.4,0.3,0.5},
{-0.4+a/2,0,0.5},
{-0.4,-0.3,0.5},
{-a/2,-0.3,0.5},
{0,-0.5,0.5},
{a/2,-0.3,0.5},
{0.4,-0.3,0.5},
{0.4-a/2,0,0.5},
{0.4,0.3,0.5},
{a/2,0.3,0.5},
{0,0.5,0.5}
};

void getLineNum(string addrstr) //获取点和面的数量
{
ifstream infile(addrstr.c_str()); //打开指定文件
string sline;//每一行
int i=0,j=0;

while(getline(infile,sline)) //从指定文件逐行读取
{
istringstream sin(sline);
sin>>s1>>f2>>f3>>f4;
if (s1=='v') //点
{
v_num++;
}
else if (s1=='f') //面
{
f_num++;
}
}
}
int readfile(string addrstr) //将文件内容读到数组中去
{
//getLineNum(addrstr);
//new二维数组
vArr=new GLfloat*[v_num];
for (int j=0;j<v_num;j++)
{
vArr[j]=new GLfloat[3];
}
fArr=new int*[f_num];
for (int k=0;k<f_num;k++)
{
fArr[k]=new int[3];
}
ifstream infile(addrstr.c_str());
string sline;//每一行
int ii=0,jj=0;

while(getline(infile,sline))
{
istringstream sin(sline);
sin>>s1>>f2>>f3>>f4;

if (s1=='v') //存储点
{
vArr[ii][0]=f2;
vArr[ii][1]=f3;
vArr[ii][2]=f4;
ii++;
}
else if (s1=='f') //存储面
{
fArr[jj][0]=f2;
fArr[jj][1]=f3;
fArr[jj][2]=f4;
jj++;
}

}

return 0;
}
void display(void)

{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glLoadIdentity();
glRotatef(rotateAngle, 1.0, 1.0, 0.0);
glScaled(x_scale,x_scale,z_scale);
//glScalef(1.0, 2.0, 1.0);
for (int i=0;i<f_num;i++)
{
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_TRIANGLES);
glColor3f(1.0,1.0,1.0);//white
glVertex3d(vArr[fArr[i][0]-1][0], vArr[fArr[i][0]-1][1], vArr[fArr[i][0]-1][2]);
glColor3f(color[i][0],color[i][1],color[i][2]);
glVertex3d(vArr[fArr[i][1]-1][0], vArr[fArr[i][1]-1][1], vArr[fArr[i][1]-1][2]);
glColor3f(color[i+1][0],color[i+1][1],color[i+1][2]);
glVertex3d(vArr[fArr[i][2]-1][0], vArr[fArr[i][2]-1][1], vArr[fArr[i][2]-1][2]);

glEnd();


}
glFlush();


glutSwapBuffers();


}
void TimeFun(int n)
{
rotateAngle += 10.0;
if(rotateAngle > 360)
rotateAngle -= 360;

display();

glutTimerFunc(120,TimeFun,0);
glutPostRedisplay ();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-2.0, 2.0, -2.0, 2.0*(GLfloat)h/(GLfloat)w,
-2.0, 2.0);
else
glOrtho(-2.0, 2.0*(GLfloat)w/(GLfloat)h, -2.0, 2.0,
-2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
}



bool isClicked;

void MouseClick(int button, int state, int x, int y) //实现鼠标控制缩放
{
if(state == GLUT_DOWN)
{
if(button == GLUT_LEFT_BUTTON) //左键放大
{
isClicked = true;
if (x_scale<=3.0f)
{
x_scale+= 1.0f;
y_scale+= 1.0f;
z_scale+= 1.0f;
}
}
else if(button == GLUT_RIGHT_BUTTON) //右键缩小
{
isClicked = true;
if (x_scale>0)
{
x_scale-= 1.0f;
y_scale-= 1.0f;
z_scale-= 1.0f;
}

}

}


}

int winMain(int argc, char* argv[])
{
string str;
cout<<"请输入要读入的obj文件(cube.obj/bunny_200.obj/bunny_1k.obj)"<<endl;
cin>>str;

glutInit(&argc, argv);

//glClearColor(1.0,1.0,1.0,0.0);
glutInitDisplayMode( GLUT_DOUBLE|GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize(800, 800);
glutInitWindowPosition(150,150);
glutCreateWindow("ReadObj");

init();
getLineNum(str);
readfile(str);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(MouseClick);
glutMainLoop();
return 0;
}



一直有错误 不知道怎么调试
...全文
230 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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