[记录]使用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\n",&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 }
啦啦啦!!!