在OpenGL C++中绘制一个球和两个圆锥体

Drawing a ball and two cones in OpenGL C++

本文关键字:两个 圆锥体 一个 OpenGL 绘制 C++      更新时间:2023-10-16

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

但是,它只显示了那些圆锥体,而没有显示球。

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

你看不到圆的原因是它被夹在近平面上。使用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);//蓝色?;)