2013-06-29 85 views
1

我有一個代碼,我想一次繪製一個碗和兩個錐體。在OpenGL C++中繪製一個球和兩個錐體

但是,它只顯示那些錐體,沒有顯示球。

#include <GL/glut.h> 
#include <stdlib.h> 
#include <Math.h>  // Needed for sin, cos 

#define PI 3.14159265f 

GLfloat ballRadius = 0.5f; // Radius of the bouncing ball 
GLfloat ballX = 0.0f;  // Ball's center (x, y) position 
GLfloat ballY = 0.0f; 
GLfloat ballXMax, ballXMin, ballYMax, ballYMin; // Ball's center (x, y) bounds 
GLfloat xSpeed = 0.02f;  // Ball's speed in x and y directions 
GLfloat ySpeed = 0.007f; 
int refreshMillis = 30;  // Refresh period in milliseconds 



static void resize(int width, int height) 
{ 
    const float ar = (float) width/(float) height; 

    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0); 


} 

static void display(void) 
{ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

//這是沒有被繪製的球的代碼。

***glTranslatef(ballX, ballY, 0.0f); // Translate to (xPos, yPos) 
    // Use triangular segments to form a circle 
    glBegin(GL_TRIANGLE_FAN); 
     glColor3f(1.0f, 0.0f, 0.0f); // Blue 
     glVertex2f(0.0f, 0.0f);  // Center of circle 
     int numSegments = 100; 
     GLfloat angle; 
     for (int i = 0; i <= numSegments; i++) { // Last vertex same as first vertex 
      angle = i * 2.0f * PI/numSegments; // 360 deg for all segments 
      glVertex2f(cos(angle) * ballRadius, sin(angle) * ballRadius); 
     } 
    glEnd();*** 

的//端球碼

 glColor3d(0,1,0); 
    glPushMatrix(); 
     glTranslated(-1.0,0.5,-6); 
     glRotated(65, -1.0, 0.0, 0.0); 
     glutSolidCone(1, 2, 70, 50); 
    glPopMatrix(); 

    glPushMatrix(); 
     glTranslated(0.0,-1.5,-6); 
     glRotated(65, -1.0, 3.0, 0.0); 
     glutWireCone(1,2, 16, 16); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 


/* Program entry point */ 

int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitWindowSize(740,580); 
    glutInitWindowPosition(10,10); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 

    glutCreateWindow("Programming Techniques - 3D Cones"); 

    glutReshapeFunc(resize); 
    glutDisplayFunc(display); 

    glClearColor(1,1,1,1); 
glutMainLoop(); 

    return EXIT_SUCCESS; 
} 

回答

2

看不到圓的原因是,它是對近平面裁剪。用glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);指定近平面在z = -2處,遠平面在z = -100處。這些值以外的任何內容都會被裁剪掉。但是通過使用glVertex2,你的圓頂點的z值是0,所以它們都被剪切。您可以通過調用glTranslatef(ballX, ballY, -10.0f);來修復它。

一對夫婦多個指針:

  1. 總是復位矩陣模式GL_MODELVIEW(例如,在你的resize()功能)。你不必這樣做,但這是一個很好的習慣。
  2. 總是glPush/PopMatrix()在修改矩陣堆棧之前(例如在翻譯圓時)。
  3. glColor3f(1.0f,0.0f,0.0f); // 藍色? ;)
+0

glColor3f(1.0f,0.0f,0.0f); // 藍色? ;) 它被設置爲藍色,然後我改變了,但忘了改變評論。 反正,謝謝你的建議。我會嘗試。 – Umair

+0

我知道,它只是讓我微笑。 :) –

+0

謝謝@andreas我解決了我的問題。 – Umair