最初に注意する必要があるのは (編集:コードを少し読み違えてしまいました。三角形のファンで問題なく動作しています)、三角形のファンは次のように機能することです。
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番目は、ほとんど見えないスペース(円柱の内側)を埋めているため、非効率的です。