[记录]使用openGL显示点云的一个程序

  1 #include <GL/glut.h>
  2 #include <stdio.h>
  3 #include <iostream>
  4 using namespace std;
  5 void myDisplay(void);
  6 //char * filename=(char *)"d:/aaacpp/点云数据转换/data/人体点云数据_out.asc";
  7 char * filename=NULL;
  8 
  9 static GLfloat xRot=0.0f;
 10 static GLfloat yRot=0.0f;
 11 int n;
 12 
 13 float xTmp[1200000];
 14 float yTmp[1200000];
 15 float zTmp[1200000];
 16 
 17 void getPoint(char * filename,float * pX,float * pY,float * pZ,int & n)
 18 {
 19     FILE * fp=NULL;
 20     n=0;
 21     if (fp = fopen(filename, "r"), fp == NULL)
 22     {
 23         cout << "文件打开失败,文件路径:" << filename << endl;
 24         exit(0);
 25     }
 26     while(!feof(fp))
 27     {
 28         fscanf(fp,"%f %f %f
",&pX[n],&pY[n],&pZ[n]);
 29         ++n;
 30         //glVertex3f(x/2,y/2,z/2);
 31     }
 32 }
 33 
 34 void printPoint(float * pX,float * pY,float * pZ,int n)
 35 {
 36     int i=0;
 37     float x,y,z;
 38     while(i<n)
 39     {
 40         x=pX[i];
 41         y=pY[i];
 42         z=pZ[i];
 43         glVertex4f(x,y,z,2.0);
 44         ++i;
 45     }
 46 }
 47 
 48 void Display(void)
 49 {
 50     glClear(GL_COLOR_BUFFER_BIT);
 51     glPushMatrix();
 52     glRotatef(xRot,1.0,0.0,0.0);
 53     glRotatef(yRot,0.0,1.0,0.0);
 54     glBegin(GL_POINTS);
 55     glColor3f(1.0,1.0,1.0);//白色
 56     //glVertex2f(0.0f,0.0f);
 57     //glVertex2f(0.5f,0.8f);
 58     
 59     printPoint(xTmp,yTmp,zTmp,n);
 60     glEnd();
 61     glBegin(GL_LINES);//glBegin和glEnd保证指定的这些点有效
 62     glColor3f(1.0,0.0,0.0);//红色
 63     glVertex3f(0.0,0.0,0.0);
 64     glVertex3f(1.0,0.0,0.0);
 65     glColor3f(0.0,1.0,0.0);//绿色
 66     glVertex3f(0.0,0.0,0.0);
 67     glVertex3f(0.0,1.0,0.0);
 68     glColor3f(0.0,0.0,1.0);//蓝色
 69     glVertex3f(0.0,0.0,0.0);
 70     glVertex3f(0.0,0.0,1.0);
 71     glEnd();
 72     glFlush();//保证前面的命令立即执行
 73     glPopMatrix();
 74     glutSwapBuffers();
 75 }
 76 
 77 void rDisplay()
 78 {
 79     static int i=0;
 80     ++i;
 81     glPushMatrix();
 82     glRotatef(0.1*i,1.0f,0.0f,0.0f);
 83     //draw();
 84     glPopMatrix();
 85     glFlush();
 86     //glutSwapBuffers();
 87 }
 88 
 89 void SpecialKeys(int key,int x,int y)
 90 {
 91     float span=5.0;
 92     switch(key)
 93     {
 94         case GLUT_KEY_UP:
 95             xRot-=span;
 96             break;
 97         case GLUT_KEY_DOWN:
 98             xRot+=span;
 99             break;
100         case GLUT_KEY_LEFT:
101             yRot-=span;
102             break;
103         case GLUT_KEY_RIGHT:
104             yRot+=span;
105             break;
106         default:
107             break;
108     }
109     xRot=(xRot>360.0)?(xRot-360.0):xRot;
110     xRot=(xRot<0.0)?(xRot+360.0):xRot;
111     yRot=(yRot>360.0)?(yRot-360.0):yRot;
112     yRot=(yRot<0.0)?(yRot+360.0):yRot;
113     glutPostRedisplay();
114 }
115 
116 int main(int argc,char* argv[])
117 {
118     glutInit(&argc,argv);
119     filename=(argc==2)?argv[1]:NULL;
120     getPoint(filename,xTmp,yTmp,zTmp,n);
121     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
122     glutInitWindowPosition(200,50);
123     glutInitWindowSize(800,800);
124     glutCreateWindow("Three Window");//直到glutMainLoop才显示窗口
125     glPointSize(1.0);
126     glLineWidth(1.0);
127     glClearColor(0.0,0.0,0.0,0.0);
128     glClear(GL_COLOR_BUFFER_BIT);
129     glFlush();
130     glutSwapBuffers();
131     glViewport(0, 0, 10, 10);
132     glMatrixMode(GL_MODELVIEW);//设置当前操作的矩阵为模型视图矩阵
133     //glLoadIdentity();//使当前绘图坐标系与世界坐标系重合
134     //glTranslatef(0.5,0.5,0.5);//使绘图坐标系相对世界坐标系沿xyz移动
135     glutDisplayFunc(&Display);
136     glutSpecialFunc(&SpecialKeys);
137     //glutIdleFunc(&rDisplay);
138     glutMainLoop();
139     return 0;
140 }
141 
142 void myDisplay(void)
143 {
144     static int i=0;
145     ++i;
146     glEnable(GL_DEPTH_TEST);
147     glColor3f(1.0f,0,0);
148     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
149     glMatrixMode(GL_PROJECTION);
150     glLoadIdentity();
151     //gluPerspective(75,1,1,40000000);
152     glMatrixMode(GL_MODELVIEW);
153     glLoadIdentity();
154         glRotatef(0.01*i,1.0f,0.0f,0.0f);
155     //gluLookAt(0,-20000000,-20000000,0,0,0,0,0,1);
156     glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
157     glPolygonMode(GL_BACK, GL_LINE);  // 设置反面为线形模式
158     glFrontFace(GL_CCW);              // 设置逆时针方向为正面
159     glBegin(GL_POLYGON);              // 按逆时针绘制一个正方形,在左下方
160         glVertex2f(-0.5f, -0.5f);
161         glVertex2f(0.0f, -0.5f);
162         glVertex2f(0.0f, 0.0f);
163         glVertex2f(-0.5f, 0.0f);
164     glEnd();
165     glBegin(GL_POLYGON);              // 按顺时针绘制一个正方形,在右上方
166         glVertex2f(0.0f, 0.0f);
167         glVertex2f(0.0f, 0.5f);
168         glVertex2f(0.5f, 0.5f);
169         glVertex2f(0.5f, 0.0f);
170     glEnd();
171 
172     glFlush();
173     glutSwapBuffers();
174 }
原文地址:https://www.cnblogs.com/vanwoos/p/4883368.html