繁体   English   中英

OpenGL-无论我在哪里单击都绘制三角形?

[英]OpenGL - Draw a Triangle wherever I click?

我有一个屏幕尺寸为1000x800的OpenGL项目,我希望能够在单击鼠标左键时绘制一个三角形。

我已经设置了运行良好的鼠标功能:

struct point
{
    int x;
    int y;
};

std::vector <point> dots;
point OneDot;

void processMouse(int button, int state, int x, int y)
{

    if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN))
    {
        int yy;
        yy = glutGet(GLUT_WINDOW_HEIGHT);
        y = yy - y; /* In Glut, Y coordinate increases from top to bottom */
        OneDot.x = x;
        OneDot.y = y;

        dots.push_back(OneDot);
   }
}

void display(){
    for (int i = 0; i < dots.size();i++){
        glPointSize(10)
        glBegin(GL_POINTS);
        glVertex2i(dots[i].x, dots[i].y);
    }
}

因此,在我的display()函数中,如何添加一些单击鼠标时在鼠标位置打印一个三角形的代码?

更新:

这是我当前的drawCircle函数:

void drawCircle(float cx, float cy, float r, float num_segments) {

    // Sets variables for X, Y, Radius and Segments
    glColor3f(1.0, 0.0, 0.0); // Red
    glBegin(GL_POLYGON);

    // To set 0 as origin point
    for (int i = 0; i < num_segments; i++) {
        float theta = 2.0f * 3.14 * i / num_segments;

        float x = r * cosf(theta);
        float y = r * sinf(theta);

        glVertex2f(x + cx, y + cy);
    }
    glEnd();
}

当我单击鼠标时,是否可以通过某种方式在鼠标位置绘制此功能?

在您的代码中,您快到了。 您必须添加两件事:在鼠标事件处理程序中,您必须设置标志来告诉窗口管理器(在您的情况下为GLUT)刷新显示。 该函数将是glutPostRedisplay

然后,在显示函数中,必须推3个顶点而不是1个顶点,并将图元类型更改为GL_TRIANGLES。 像这样

void processMouse(int button, int state, int x, int y)
{

    if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN))
    {
        int yy;
        yy = glutGet(GLUT_WINDOW_HEIGHT);
        y = yy - y; /* In Glut, Y coordinate increases from top to bottom */
        OneDot.x = x;
        OneDot.y = y;

        dots.push_back(OneDot);
        glutPostRedisplay(); ///<<<<<<<<<<
   }
}

void display(){
    glBegin(GL_TRIANGLES);
    for (int i = 0; i < dots.size();i++){
        glPointSize(10)

        glVertex2i(dots[i].x-3, dots[i].y-5);
        glVertex2i(dots[i].x+3, dots[i].y-5);
        glVertex2i(dots[i].x, dots[i].y+5);
    }
    glEnd();
}

或者,如果您想通过单击来定义三角形的角,

void display(){
    glBegin(GL_TRIANGLES);
    for (int i = 0; i < dots.size();i++){
        glPointSize(10);

        glVertex2i(dots[i].x, dots[i].y);
    }
    glEnd();
}

您实际上不必检查是否3 <= dots.size()因为OpenGL那时将不会绘制任何内容。

我没有glbegin书写法方面的经验,但似乎您错过了glend

应该是这样的:

void display(){
    glPointSize(10)
    glBegin(GL_POINTS);
    for (int i = 0; i < dots.size();i++){            
        glVertex2i(dots[i].x, dots[i].y);
    }
    glEnd()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM