2

我有一个代码,我想一次画一个碗和两个圆锥。

但是,它只显示那些锥体,而不显示球。

#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;
}
4

1 回答 1

3

您看不到圆圈的原因是它被夹在近平面上。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); // 蓝色的?;)
于 2013-06-29T11:04:21.063 回答