gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:17:00 27 4
gpt4 key购买 nike

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

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

#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);//蓝色的? ;)

关于c++ - 在 OpenGL C++ 中绘制一个球和两个锥体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17378113/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com