我想使用OpenGL库绘制带有扇区的Ring,每个扇区都有不同的颜色。
要画一个戒指,我知道我可以使用gluDisk(gluNewQuadric(), 0, 1.5, 32, 100);
但是为了绘制不同颜色的扇区或区域,我认为我需要使用GL_TRIANGLE_FAN
或类似的手动方式。
我以这种方式尝试,但输出不是那么准确。
const float DEG2RAD = 3.14159/180;
glBegin( GL_TRIANGLE_FAN );
for( int i = 0; i <= 90; i++ )
{
float degInRad = i*DEG2RAD;
glVertex2f(x, y); // point of the inner circle of the ring
for( int n = 0; n <= 4; n++ )
{
float const t = = i*DEG2RAD*(n/4);
glVertex2f(x + sin(t)*r, y + cos(t)*r); // points of the outer circle.
}
}
glEnd();
这个想法遵循这个GL_TRIANGLE_FAN
如何工作的图表,在外圈中为内圈中计算的每个点取4个点。因为外圈比内圈长。这就是循环进入另一个循环的原因。
答案 0 :(得分:2)
您的代码引用了“内圈”和“外圈”,但您所拥有的只是一个中心点(x,y),而您的外圈点将遍布整个地方,因为您的角度计算不会很有意义(你在外部循环中计算一个值,在任何地方都没有使用,然后只是在内部循环中将所有东西相乘,用4除以得到良好的度量......这不会发生给你一个圆圈的好点。)
无论如何,您不能使用单个三角形扇形绘制环,因为风扇中的所有三角形都必须连接到单个点。没有神奇的方法可以在不同的点重新启动风扇,你只需要glEnd()并开始一个新的。这不适用于围绕戒指进行,因为你会留下空白。三角扇通常是经典GL原语中最不实用的之一。
我知道你试图在较小的圈子中使用较少的积分,但说实话,我看不出它是值得的。
你最好的选择是使用三角形条带,在你的圆圈周围有一个环,每次都放入一个内部和外部顶点。
段的伪代码:
glBegin(GL_TRIANGLE_STRIP);
for(angle = start_angle; angle < end_angle ; angle += small_increment)
{
s = sin(angle); c = cos(angle);
glVertex2f( x + c * r1, y + s * r1);
glVertex2f( x + c * r2, y + s * r2);
}
glEnd();