opengl中的半圆柱/闭合圆柱

时间:2014-05-17 11:42:34

标签: c linux opengl glu

我目前有一个圆柱

glPushMatrix();
glTranslatef(cylinder->pos[0], cylinder->pos[1], cylinder->pos[2]);
glRotatef(cylinder->angle, -1.0, 0, 0);
gluDisk(quad, 0.0, cylinder->radius, 300, 90);
gluCylinder(quad, cylinder->radius, cylinder->radius, cylinder->height, 30, 1);
gluDeleteQuadric(quad);
glPopMatrix();

但它只渲染了一半的圆柱而不是整个圆形(一半朝向视图)。第二个问题是我不知道如何关闭汽缸。胶盘只关闭圆筒的底部,我不知道如何关闭顶部。

1 个答案:

答案 0 :(得分:2)

如果我理解你所描述的内容,听起来你可能已经启用了背面剔除。你的代码中有glEnable(GL_CULL_FACE)电话吗?这将消除所有背向您的多边形。在任何情况下,一旦你绘制一个两侧都关闭的圆柱体,就可以保持它的启用状态。

在应用将其移动到(0,0,高度)的平移后,您可以通过另一个gluDisk()调用关闭顶部的圆柱体。为了正确,我相信你需要旋转关闭底部圆柱体的磁盘。否则它将面向圆柱体的内部而不是外部,这将影响法线,并且当它应该可见时,将通过背面剔除来消除它。

对于完整的事情,它应该看起来像这样(未经测试):

glPushMatrix();
glTranslatef(cylinder->pos[0], cylinder->pos[1], cylinder->pos[2]);
glRotatef(cylinder->angle, -1.0f, 0.0f, 0.0f);
gluCylinder(quad, cylinder->radius, cylinder->radius, cylinder->height, 30, 1);
glPushMatrix();
glTranslatef(0.0f, 0.0f, cylinder->height);
gluDisk(quad, 0.0f, cylinder->radius, 30, 1);
glPopMatrix();
glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
gluDisk(quad, 0.0f, cylinder->radius, 30, 1);
gluDeleteQuadric(quad);
glPopMatrix();