【问题标题】:OpenGL: cylinder misshaped after turning it 90 degreeOpenGL:圆柱体在旋转 90 度后变形
【发布时间】:2021-05-31 19:56:01
【问题描述】:

我和我的大学项目合作伙伴正在做这个项目。我们用 c++ 和 OpenGL 2.1 用 freeglut.lib 编写了这个我们将圆柱体旋转 90 度放在地面上。现在圆柱体奇怪的是misshaped。我们如何修复畸形?这是透视的事情吗?我们想稍后将圆柱体用作汽车的轮子,我们应该在圆形轨道上进行动画驾驶。现在car 上的轮子只是二维圆。

void draw_cylinder(GLfloat radius,
    GLfloat height,
    GLubyte R,
    GLubyte G,
    GLubyte B)
{
    GLfloat x = 0.0;
    GLfloat y = 0.0;
    GLfloat angle = 0.0;
    GLfloat angle_stepsize = 0.1;

    /** Draw the tube */
    glColor3ub(R - 40, G - 40, B - 40);
    glBegin(GL_QUAD_STRIP);
    angle = 0.0;
    while (angle < 2 * PI) {
        x = radius * cos(angle);
        y = radius * sin(angle);
        glVertex3f(x, y, height);
        glVertex3f(x, y, 0.0);
        angle = angle + angle_stepsize;
    }
    glVertex3f(radius, 0.0, height);
    glVertex3f(radius, 0.0, 0.0);
    glEnd();

    /** Draw the circle on top and bottom of cylinder */
    glColor3ub(R, G, B);
    glBegin(GL_POLYGON);
    angle = 0.0;
    while (angle < 2 * PI) {
        x = radius * cos(angle);
        y = radius * sin(angle);
        glVertex3f(x, y, height);
        angle = angle + angle_stepsize;
    }
    glVertex3f(radius, 0.0, height);
    glEnd();
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(0.0, -0.4, -3.0);
    //glRotatef(-40, 1.0, 0.0, 0.0);
    glRotatef(-200, 1.0, 0.0, 0.0);

    draw_cylinder(0.3, 0.5, 255, 160, 100);

    glFlush();
}

void reshape(int width, int height)
{
    if (width == 0 || height == 0) return;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(40.0, (GLdouble)width / (GLdouble)height,
        0.5, 20.0);

    glMatrixMode(GL_MODELVIEW);
    glViewport(0, 0, width, height);
}

int main(int argc, char** argv)
{
    /** Initialize glut */
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutCreateWindow("Create Cylinder");
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

    glutMainLoop();

    return 0;
}

【问题讨论】:

  • 在我看来,好像你会将圆柱体转动 -200 度,而不是 90 度。如果我没记错的话,你也没有使用深度测试,这会导致更远的面画在较近的脸上。
  • 我第一次尝试使用 90,但不知何故没有任何改变。

标签: c++ opengl glut freeglut


【解决方案1】:

您需要启用Depth Test:

glEnable(GL_DEPTH_TEST);

同时清除深度缓冲区

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

例子:

float angle = 0.0f;
void display(void)
{
    glEnable(GL_DEPTH_TEST);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(0.0, -0.4, -3.0);
    glRotatef(angle, 0.0, 1.0, 0.0);
    angle += 0.1f;
    glRotatef(-200, 1.0, 0.0, 0.0);

    draw_cylinder(0.3, 0.5, 255, 160, 100);

    glFlush();
    glutPostRedisplay();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2019-08-05
    • 2022-01-18
    相关资源
    最近更新 更多