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

最初に注意する必要があるのは (編集:コードを少し読み違えてしまいました。三角形のファンで問題なく動作しています)、三角形のファンは次のように機能することです。

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

例えば:

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

2 つ目は、シリンダーが 3 つの部分で構成されていることです。

               __
              /  \
              \__/        <---- 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();

あなたがやろうとしていた方法は、実際には円柱を作っているのではなく、多くの円を積み重ねているため、最初は正しくありません.2番目は、ほとんど見えないスペース(円柱の内側)を埋めているため、非効率的です。

于 2012-12-14T16:23:09.770 に答える
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 に答える