0

我正在尝试使用三角形风扇创建一个实心圆柱体。到目前为止我所做的是:

float base = 0.5;
float height = 20;
float radius = 2.0f;
glBegin(GL_TRIANGLE_FAN);
for(float j=0; j<=height; j+=0.1)
{
    glVertex3f(0,j,0);
    for(int i=0; i<360; i++)
    {
        glVertex3f(radius*sin((float)i),j, radius*cos((float)i));
    }   
}
glEnd();
glPopMatrix();

问题出现在这 3 个屏幕截图中:

在此处输入图像描述
正如您在所有 3 个屏幕截图中看到的那样,似乎有一些空间,而不是一个实心圆柱体。
那样可以么?

4

2 回答 2

2
for(int i=0; i<360; i++)
{
    glVertex3f
        (
        radius*sin((float)i),
        j, 
        radius*cos((float)i)
        );
}

C 标准库sin()cos()函数采用弧度,而不是度数。

尝试转换(float)i为弧度,然后再将其传递给sin()/cos().

于 2012-12-14T16:14:00.423 回答
2

您应该注意的第一件事(编辑:我稍微误读了您的代码。您对三角形风扇做得很好)是三角形风扇的工作原理是这样的:

glVertex: Center point
for each outer point p
    glVertex: p

例如:

                  p2__
                 /|   ---___p1
                /  |         /
               /    |       /
            p3/      |     /
              |\      |   /
              |   \    | /
               |     \_O   Center
               | __---
               p4

第二件事是气缸由三部分组成:

               __
              /  \
              \__/        <---- circle on top (facing up)
              |  |
              |  |
              |  |
              |  |        <---- tube in the middle
              |  |
              |  |
              |  |
              \__/        <---- circle on the bottom (facing down)

所以你需要的算法是:

/* top triangle */
glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0, height, 0);  /* center */
    for (i = 0; i <= 2 * PI; i += resolution)
        glVertex3f(radius * cos(i), height, radius * sin(i));
glEnd();

/* bottom triangle: note: for is in reverse order */
glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0, 0, 0);  /* center */
    for (i = 2 * PI; i >= 0; i -= resolution)
        glVertex3f(radius * cos(i), 0, radius * sin(i));
    /* close the loop back to 0 degrees */
    glVertex3f(radius, height, 0);
glEnd();

/* middle tube */
glBegin(GL_QUAD_STRIP);
    for (i = 0; i <= 2 * PI; i += resolution)
    {
        glVertex3f(radius * cos(i), 0, radius * sin(i));
        glVertex3f(radius * cos(i), height, radius * sin(i));
    }
    /* close the loop back to zero degrees */
    glVertex3f(radius, 0, 0);
    glVertex3f(radius, height, 0);
glEnd();

您尝试做的方式首先是不正确的,因为您实际上并没有制作一个圆柱体,而是堆叠了许多圆圈,其次是效率低下,因为您正在填充几乎不可见的空间(圆柱体内部)。

于 2012-12-14T16:23:09.770 回答