#include <GL/glut.h>
#include <stdio.h>
#include <iostream>
#include<string>
#include<fstream>
#include<sstream>
using namespace std;
int v_num=0; //记录点的数量
int f_num=0; //记录面的数量
int vn_num=0;
GLfloat **vArr; //存放点的二维数组
int **fvArr; //存放面顶点的二维数组
int **fnArr;
GLfloat **vnArr;
string s1,s2,s3,s4;
GLfloat f2,f3,f4;
void getLineNum(string addrstr) //获取点和面的数量
{
ifstream infile(addrstr.c_str()); //打开指定文件
string sline;//每一行
int i=0,j=0;
while(getline(infile,sline)) //从指定文件逐行读取
{
if(sline[0]=='v')
{
if(sline[1]=='n')
vn_num++;
else
v_num++;
}
if(sline[0]=='f')
{
f_num++;
}
}
}
int readfile(string addrstr) //将文件内容读到数组中去
{
//getLineNum(addrstr);
//new二维数组
vArr=new GLfloat*[v_num];
for (int i=0;i<v_num;i++)
{
vArr[i]=new GLfloat[3];
}
vnArr=new GLfloat*[vn_num];
for (i=0;i<vn_num;i++)
{
vnArr[i]=new GLfloat[3];
}
fvArr=new int*[f_num];
fnArr=new int*[f_num];
for (i=0;i<f_num;i++)
{
fvArr[i]=new int[3];
fnArr[i]=new int[3];
}
ifstream infile(addrstr.c_str());
string sline;//每一行
int ii=0,jj=0,kk=0;
while(getline(infile,sline))
{
if(sline[0]=='v')
{
if(sline[1]=='n')//vn
{
istringstream sin(sline);
sin>>s1>>f2>>f3>>f4;
vnArr[ii][0]=f2;
vnArr[ii][1]=f3;
vnArr[ii][2]=f4;
ii++;
}
else//v
{
istringstream sin(sline);
sin>>s1>>f2>>f3>>f4;
vArr[jj][0]=f2;
vArr[jj][1]=f3;
vArr[jj][2]=f4;
jj++;
}
}
if (sline[0]=='f') //存储面
{
istringstream in(sline);
GLfloat a;
in>>s1;//去掉f
int i,k;
for(i=0;i<3;i++)
{
in>>s1;
cout<<s1<<endl;
//取出第一个顶点和法线索引
a=0;
for(k=0;s1[k]!='/';k++)
{
a=a*10+(s1[k]-48);
}
fvArr[kk][i]=a;
a=0;
for(k=k+2;s1[k];k++)
{
a=a*10+(s1[k]-48);;
}
fnArr[kk][i]=a;
}
kk++;
}
}
return 0;
}
void init(void)
{
getLineNum("wan.obj");
readfile("wan.obj");
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {50.0};
GLfloat light_position[] = {1.0, 1.0f, 1.0, 0.0};
GLfloat white_light[] = {1.0, 1.0, 1.0, 1.0};
GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
/*
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculation
*/
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(1.0,-0.0,-8.0);
glScalef(0.1,0.1,0.1);
for (int i=0;i<f_num;i++)
{
// glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_TRIANGLES);
glNormal3f(vnArr[fnArr[i][0]-1][0], vnArr[fnArr[i][0]-1][1], vnArr[fnArr[i][0]-1][2]);
glVertex3f(vArr[fvArr[i][0]-1][0], vArr[fvArr[i][0]-1][1], vArr[fvArr[i][0]-1][2]);
glNormal3f(vnArr[fnArr[i][1]-1][0], vnArr[fnArr[i][1]-1][1], vnArr[fnArr[i][1]-1][2]);
glVertex3f(vArr[fvArr[i][1]-1][0], vArr[fvArr[i][1]-1][1], vArr[fvArr[i][1]-1][2]);
glNormal3f(vnArr[fnArr[i][2]-1][0], vnArr[fnArr[i][2]-1][1], vnArr[fnArr[i][2]-1][2]);
glVertex3f(vArr[fvArr[i][2]-1][0], vArr[fvArr[i][2]-1][1], vArr[fvArr[i][2]-1][2]);
glEnd();
}
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-1.5, 1.5, -1.5 * (GLfloat)h/(GLfloat)w, 1.5 * (GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho(-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

gongzixiaoya
- 粉丝: 7
最新资源
- 人工智能物联网市场分析及竞争策略分析报告.docx
- 浅论高职学生网络安全问题及解决对策.docx
- kV系统GIS装置安装工法——最终.doc
- 基于web的数据库设计实践考核要求.doc
- 新酷炫多色科技风区块链技术介绍PPT模板PPT可编辑课件模板.pptx
- 实用图解安装和设置家庭网络无线路由器.doc
- 浅析区块链在会计和审计领域运用的可行性.docx
- kubernetes学习01—kubernetes介绍.doc
- 第章施工总进度表和网络图说明.doc
- 网络流行语的社会文化分析.docx
- 新时期计算机软件开发中Java语言的应用.docx
- 专题六第二讲推理证明算法初步复数.ppt
- AJ-Captcha-Java资源
- 全国计算机等级测验一级试题及答案(套).doc
- 基于Web的图书管理系统的研究设计与开发.doc
- 谭浩强c语言程序设计方案习题集.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
- 4
- 5
- 6
前往页