图形学读取立方体、兔子、八字三维模型代码及截图_第1页
已阅读1页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include <stdlib.h>#include <GL/glut.h>#include <stdio.h>#include <iostream>#include <string>#include <fstream>#include <sstream>#include<cmath>using namespace std;int v_num = 0; /记录点的数量int f_num = 0; /记录面的数量int vn_num = 0;/记录法向量的数量int vt_num = 0;GLflo

2、at *vArr; /存放点的二维数组int *fvArr; /存放面顶点的二维数组int *fnArr;/存放面法向量的二维数组int *ftArr;GLfloat *vtArr;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, slin

3、e) /从指定文件逐行读取if (sline0 = 'v')if (sline1 = 'n')vn_num+;else if(sline1 = 't')vt_num+;elsev_num+;if (sline0 = 'f')f_num+;int readfile(string addrstr) /将文件内容读到数组中去/getLineNum(addrstr);/new二维数组vArr = new GLfloat*v_num;for (int i = 0; i<v_num; i+)vArri = new GLfloat3;vn

4、Arr = new GLfloat*vn_num;for (int i = 0; i<vn_num; i+)vnArri = new GLfloat3;vtArr = new GLfloat*vt_num;for (int i = 0; i<vt_num; i+)vtArri = new GLfloat2;fvArr = new int*f_num;fnArr = new int*f_num;ftArr = new int*f_num;for (int i = 0; i<f_num; i+)fvArri = new int3;fnArri = new int3;ftArri

5、= new int2;ifstream infile(addrstr.c_str();string sline;/每一行int ii = 0, jj = 0, kk = 0, mm = 0;while (getline(infile, sline)if (sline0 = 'v')if (sline1 = 'n')/vnistringstream sin(sline);sin >> s1 >> f2 >> f3 >> f4;vnArrii0 = f2;vnArrii1 = f3;vnArrii2 = f4;ii+;

6、else if (sline1 = 't')istringstream sin(sline);sin >> s1 >> f2 >> f3 ;cout << f2 << f3;vtArrmm0 = f2;vtArrmm1 = f3;/vtArrmm2 = f4;mm+;else/vistringstream sin(sline);sin >> s1 >> f2 >> f3 >> f4;vArrjj0 = f2;vArrjj1 = f3;vArrjj2 = f4;jj+;if

7、 (sline0 = 'f') /存储面istringstream in(sline);GLfloat a;in >> s1;/去掉fint i, k;for (i = 0; i < 3; i+)in >> s1;cout << s1 << endl;/取出第一个顶点和法线索引a = 0;/int len = sizeof(s1);int len = s1.length();cout << len;for (int m = 0; m <len; m+)if (s1m != '/')a = a

8、 * 10 + (s1m - 48);fvArrkki = a;elsem+;if (m <=3)if (s1m != '/')a = a * 10 + (s1m - 48);ftArrkki = a;elsem+;a = a * 10 + (s1m - 48);fnArrkki = a;else/m+;a = a * 10 + (s1m - 48);fnArrkki = a;/for (k = 0; s1k != '/' k+)/a = a * 10 + (s1k - 48);/fvArrkki = a;/a = 0;/for (k = k + 2; s

9、1k; k+)/a = a * 10 + (s1k - 48);/fnArrkki = a;kk+;return 0;void init(void)getLineNum("Eight.obj");readfile("Eight.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

10、, 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_

11、DIFFUSE, white_light);/漫反射光源glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);/镜面反射光源glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);/环境光源glEnable(GL_LIGHTING);/启动光照glEnable(GL_LIGHT0);/启用0度光源glEnable(GL_DEPTH_TEST);/启动深度测试/*glShadeModel(GL_SMOOTH);/ Enable Smooth ShadingglClearColor(0.0f, 0.0f,

12、 0.0f, 0.5f);/ 黑色背景glClearDepth(1.0f);/ 深度缓冲区设置glEnable(GL_DEPTH_TEST);/ 允许深度测试glDepthFunc(GL_LEQUAL);/ 定义深度测试类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);/ Really Nice Perspective Calculation*/void display(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/gluLookAt(-2.0, -2.0, -2.0, 0

13、.0, 0.0, 0.0, 0.0, 1.0, 0.0); /设置观察的位置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);if (vn_num = 0)/glNormal3f(vnArrfnArri0 - 10, vnArrfnArri0 - 11, vnArrfnArri0 - 12);glVertex3f(vArrfvArri0 - 10,

14、 vArrfvArri0 - 11, vArrfvArri0 - 12);/glNormal3f(vnArrfnArri1 - 10, vnArrfnArri1 - 11, vnArrfnArri1 - 12);glVertex3f(vArrfvArri1 - 10, vArrfvArri1 - 11, vArrfvArri1 - 12);/glNormal3f(vnArrfnArri2 - 10, vnArrfnArri2 - 11, vnArrfnArri2 - 12);glVertex3f(vArrfvArri2 - 10, vArrfvArri2 - 11, vArrfvArri2 -

15、 12);elseglTexCoord2f(vtArrftArri0 - 10, vtArrftArri0 - 11);/glNormal3f(vnArrfnArri0 - 10, vnArrfnArri0 - 11, vnArrfnArri0 - 12);glVertex3f(vArrfvArri0 - 10, vArrfvArri0 - 11, vArrfvArri0 - 12);glTexCoord2f(vtArrftArri1 - 10, vtArrftArri1 - 11);/glNormal3f(vnArrfnArri1 - 10, vnArrfnArri1 - 11, vnArr

16、fnArri1 - 12);glVertex3f(vArrfvArri1 - 10, vArrfvArri1 - 11, vArrfvArri1 - 12);glTexCoord2f(vtArrftArri2 - 10, vtArrftArri2 - 11);/glNormal3f(vnArrfnArri2 - 10, vnArrfnArri2 - 11, vnArrfnArri2 - 12);glVertex3f(vArrfvArri2 - 10, vArrfvArri2 - 11, vArrfvArri2 - 12);glEnd();glFlush();/强制绘图void reshape(

17、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);elseglOrtho(-1.5*(GLfloat)w / (GLfloat)h, 1.5*(GLfloat)w / (GLfloat)

18、h, -1.5, 1.5, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();int main(int argc, char *argv)glutInit(&argc, argv);/对GLUT进行初始化glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);/设置显示方式,单缓冲、RGB颜色glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100); /glutCreateWindow(argv0);glutCreateWindow("Test");init();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论