c – 使用OpenGL绘制随机点/星星?
我试图绘制一些随机点作为窗口中的星星,
但积分没有显示出来.但其他对象正确显示. 我的源代码: #include<windows.h> #include <GLglut.h> #include <math.h> // For math routines (such as sqrt & trig). GLfloat xRotated,yRotated,zRotated; GLdouble radius=3; GLfloat qaBlack[] = {0.0,0.0,1.0}; //Black Color GLfloat qaGreen[] = {0.0,1.0,1.0}; //Green Color GLfloat qaWhite[] = {1.0,1.0}; //White Color GLfloat qaRed[] = {1.0,1.0}; //Red Color // Set lighting intensity and color GLfloat qaSpecularLight[] = {1.0,1.0}; GLfloat emitLight[] = {0.9,0.9,0.9}; GLfloat Noemit[] = {0.0,1.0}; // Light source position GLfloat qaLightPosition[] = {1,1,1}; void display(void); void reshape(int x,int y); void idleFunc(void) { if ( zRotated > 360.0 ) { zRotated -= 360.0*floor(zRotated/360.0); // Don't allow overflow } if ( yRotated > 360.0 ) { yRotated -= 360.0*floor(yRotated/360.0); // Don't allow overflow } zRotated += 0.05; yRotated +=0.01; display(); } void initLighting() { // Enable lighting glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0,GL_SPECULAR,qaSpecularLight); } void display(void){ glMatrixMode(GL_MODELVIEW); // clear the drawing buffer. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // clear the identity matrix. glLoadIdentity(); glTranslatef(0.0,-40.0); glPushMatrix(); glutSolidSphere(radius,25,25); glPopMatrix(); glPopMatrix(); glPushMatrix(); glRotatef(yRotated,2.0,0.0); glTranslatef(5.0,0.0); // Set the light position glLightfv(GL_LIGHT0,GL_POSITION,qaLightPosition); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emitLight); // Make sphere glow (emissive) glutSolidSphere(radius/6,25); glMaterialfv(GL_FRONT_AND_BACK,Noemit); glPopMatrix(); glTranslatef(0.0,0.0); glPushMatrix(); glColor3f(1.0,1.0); glPointSize(3); for(int i=1;i<100;i++){ int x = rand()%640 ; int y = rand()%480; glBegin(GL_POINTS); glVertex2i (x,y); glEnd(); } glPopMatrix(); glLoadIdentity(); glColor3f(1.0,1.0); glPointSize(3); for(int i=1;i<100;i++){ int x = rand()%640 ; int y = rand()%480; glBegin(GL_POINTS); glVertex2i (x,y); glEnd(); } glFlush(); //FOR RENDERING glutSwapBuffers(); } void reshape(int x,int y){ if(y == 0 || x == 0) return; glMatrixMode(GL_PROJECTION); gluPerspective(20.0,(GLdouble)x/(GLdouble)y,0.6,40.0); glMatrixMode(GL_MODELVIEW); glViewport(0,x,y); //Use the whole window for rendering } int main (int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); glutInitWindowSize(1000,600); glutCreateWindow("Project_KD"); initLighting(); xRotated = yRotated = zRotated = 0.0; glutIdleFunc(idleFunc); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } 解决方法
很多不满:
>无法匹配的glPushMatrix()/ glPopMatrix()调用的几个实例;避免矩阵堆过度/不足;我喜欢使用额外的范围来直观地指示矩阵堆栈嵌套. 全部一起: #include <GL/glut.h> #include <cmath> GLfloat xRotated,zRotated; GLdouble radius = 3; void timer( int value ) { if( zRotated > 360.0 ) { zRotated -= 360.0 * floor( zRotated / 360.0 ); // Don't allow overflow } if( yRotated > 360.0 ) { yRotated -= 360.0 * floor( yRotated / 360.0 ); // Don't allow overflow } zRotated += 5.0; yRotated += 1.0; glutTimerFunc( 16,timer,0 ); glutPostRedisplay(); } void display() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glDepthMask( GL_FALSE ); glDisable( GL_DEPTH_TEST ); glDisable( GL_LIGHTING ); // 2D rendering glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( 0,640,480,-1,1 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glPushMatrix(); { glColor3f( 1.0,1.0 ); glPointSize( 3 ); glBegin( GL_POINTS ); for( int i = 1; i < 100; i++ ) { int x = rand() % 640; int y = rand() % 480; glVertex2i( x,y ); } glEnd(); } glPopMatrix(); glDepthMask( GL_TRUE ); glEnable( GL_DEPTH_TEST ); // Enable lighting glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); GLfloat qaSpecularLight[] = {1.0,1.0}; glLightfv( GL_LIGHT0,qaSpecularLight ); // 3D rendering glMatrixMode( GL_PROJECTION ); glLoadIdentity(); double w = glutGet( GLUT_WINDOW_WIDTH ); double h = glutGet( GLUT_WINDOW_HEIGHT ); gluPerspective( 20.0,w / h,0.1,80.0 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glTranslatef( 0.0,-40.0 ); glPushMatrix(); { glutSolidSphere( radius,25 ); } glPopMatrix(); glPushMatrix(); { glRotatef( yRotated,0.0 ); glTranslatef( 5.0,0.0 ); GLfloat qaLightPosition[] = {1,1}; glLightfv( GL_LIGHT0,qaLightPosition ); GLfloat emitLight[] = {0.9,0.9}; glMaterialfv( GL_FRONT_AND_BACK,emitLight ); // Make sphere glow (emissive) glutSolidSphere( radius / 6,25 ); GLfloat Noemit[] = {0.0,1.0}; glMaterialfv( GL_FRONT_AND_BACK,Noemit ); } glPopMatrix(); glutSwapBuffers(); } int main( int argc,char** argv ) { glutInit( &argc,argv ); glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); glutInitWindowSize( 1000,600 ); glutCreateWindow( "Project_KD" ); xRotated = yRotated = zRotated = 0.0; glutDisplayFunc( display ); glutTimerFunc( 0,0 ); glutMainLoop(); return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |