我正在尝试使用三角扇创建一个实心圆柱体。 到目前为止我所做的是:
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个屏幕截图中看到的那样,似乎有一些空间而不是实心圆柱体
这可以吗?
答案 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();
你试图做的方法首先是不正确的,因为你实际上并没有制作圆柱体,而是堆叠了许多圆圈,其次是低效率,因为你填充了大部分看不见的空间(圆柱内部) )。