OpenGL:尝试使用triangle_fan创建一个实心圆柱体

时间:2012-12-14 15:15:46

标签: opengl

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

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个屏幕截图中:

enter image description here
正如您在所有3个屏幕截图中看到的那样,似乎有一些空间而不是实心圆柱体 这可以吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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();

你试图做的方法首先是不正确的,因为你实际上并没有制作圆柱体,而是堆叠了许多圆圈,其次是低效率,因为你填充了大部分看不见的空间(圆柱内部) )。