我有一个屏幕尺寸为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();
}
当我点击鼠标时,有没有办法在鼠标位置以某种方式绘制此功能?
答案 0 :(得分:2)
在您的代码中,您几乎就在那里。您必须添加两件事:在鼠标事件处理程序中,您必须设置一个标志,告诉您的窗口管理器(在您的情况下为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只会简单地绘制。
答案 1 :(得分:0)
我没有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()
}