2013-06-29 50 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