0

我想使用 OpenGL 库绘制一个带有扇区的环,每个扇区都有不同的颜色。画一个我知道我可以用的戒指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 个点,为内圈中计算的每个点。因为外圈比内圈长。这就是循环进入另一个循环的原因。

OpenGL绘图的类型

4

1 回答 1

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();
于 2012-12-11T15:08:07.890 回答