2016-09-07 164 views
0

我想用鼠标在我的鼠标中心画一个圆圈,然后在屏幕上拖动它,使用函数mouseMove(int x,int y)。圈子将被绘制在移动的鼠标上,就像喷漆一样。到目前为止,这是我OpenGL用鼠标移动绘制圆圈

void mouseMove(int x, int y) { 
    glBegin(GL_POLYGON); 
     for (int i = 0; i <= 360; i++) 
     { 
      float theta = (2 * 3.14 * i)/360; 
      glVertex2f((size/2 + x) * cos(theta), (size/2 + y) * sin(theta)); 
     } 
    glEnd(); 
    glutPostRedisplay(); 
} 

但是使用这个时候,它绘制未在我中心的鼠标非常大圈。我将如何改变这一点,让程序在我的鼠标上绘制圆心?

要描述该项目,我正在创建一个绘图程序,用于更改mouseMove中完成的图形的形状,颜色,大小和旋转。目前,尺寸是int设置为32.当用户在键盘功能中使用'b'键选择形状时,他/她可以随着用户点击并拖动鼠标来切换鼠标周围绘制的形状周围。像喷漆一样。除了圆形喷雾外,所有其他形状都围绕着鼠标成形。

+0

这可能是因为你的相机关闭了。消歧:就位置而言。 –

+0

这个函数里面还有if语句用于其他形状,如正方形和三角形。所有这些绘制正确。这是唯一一个关闭的。 – JMV12

+0

我认为在问题中包含如何制作投影(正视或透视?尺寸?FOV?) –

回答

1

这个答案假定像你的视口和投影矩阵的东西设置正确,并且该函数的输入考虑到“屏幕坐标”(鼠标使用的东西)不是一样的事实“OpenGL坐标空间”(这通常意味着颠倒一个或另一个的y轴方向)。

您用于设置顶点坐标的数学运算错误。不应该用正弦/余弦函数乘以鼠标的xy坐标。

正确的方式来写它是

glVertex2f((size/2) * cos(theta) + x, (size/2) * sin(theta) + y); 

我还想补充一点,你似乎仍然在使用OpenGL的立即模式渲染,这是过时的,并会提供一个专业的设置极差培训。我强烈建议您学习Modern OpenGL(3.x +),并将这些概念重新应用于您正在处理的任何项目。 This is a very good tutorial.

+0

我试过了,我看不到这些圆圈。我猜我的相机关闭了,但我还没有做任何代码来改变它的默认值。 – JMV12

+0

然后,您必须提供解释如何设置投影矩阵的代码。因为OpenGL的坐标空间是'[-1,1],但屏幕/窗口的坐标是'[0,window_size]',所以圆形显示的方式超出了窗口边界的机会相当不错。设置为'(0,framebuffer_width,0,framebuffer_height,-1,1)'的正交投影矩阵可能会解决这个问题。 – Xirema