OpenGL - 绘图模式

Posted

技术标签:

【中文标题】OpenGL - 绘图模式【英文标题】:OpenGL - Drawing Patterns 【发布时间】:2019-10-02 03:23:02 【问题描述】:

附加图像是我想要做的:

但是,我的代码给了我以下模式:

谁能指引我正确的方向?

void drawPattern(float xPos, float yPos, float length)
    glColor3f(0.0, 1.0, 0.0);
        // Drawing Square 
        glBegin(GL_POLYGON);
        glVertex2f(xPos + length, yPos);
        glVertex2f(xPos, yPos);
        glVertex2f(xPos , yPos + length);
        glVertex2f(xPos + length , yPos + length);
    glEnd();

    glColor3f(0,0,1);
    float halfPi = 0.5 * PI;
    //Drawing Bottom Left Circle
    glBegin(GL_LINE_LOOP);
    for (float angle = 0.0; angle < 90 * 0.01745329; angle += 0.01745329)
        glVertex2f( xPos + (length/2)*cos(angle), yPos + (length/2)*sin(angle));
    
    glEnd();

    //Drawing Top Right Circle 
    glBegin(GL_LINE_LOOP);
    for (float angle = 0.0; angle < 90 * 0.01745329; angle += 0.01745329)
        glVertex2f( xPos + length/2 + (length/2)*cos(angle), yPos + length/2 + (length/2)*sin(angle));
    
    glEnd();

【问题讨论】:

【参考方案1】:

除了你必须使用line primitive typeGL_LINE_STRIP而不是GL_LINE_LOOP,答案中已经提到,右上角的弧线方向错误。

这是因为圆弧的中心点必须是左上角(xPos + lengthyPos + length),而不是四边形的中心。此外,必须在左下角绘制圆弧。这是通过减去正弦和余弦项来实现的:

glBegin(GL_LINE_STRIP);
for (float angle = 0.0; angle < 90 * 0.01745329; angle += 0.01745329) 
    glVertex2f(
        xPos + length - (length/2)*cos(angle),
        yPos + length - (length/2)*sin(angle));

glEnd();

【讨论】:

【参考方案2】:

使用 GL_LINE_STRIP 而不是 GL_LINE_LOOP 可能是个不错的主意。与前者不同,后者将始终将终点连接到起点。

【讨论】:

以上是关于OpenGL - 绘图模式的主要内容,如果未能解决你的问题,请参考以下文章

从 OpenGL 切换到 GDI

OpenGL显示列表比立即模式慢?

QDeclarativeItem 中的 OpenGL 绘图搞乱了其他 QML 绘图

许多OpenGL绘图区域交换缓冲区减速问题

OpenGL:如何最小化绘图?

OpenGL VBO 绘图