OpenGL 用鼠标移动画圆
OpenGL draw circle with Mouse Move
我正在尝试使用函数 mouseMove(int x, int y) 绘制一个以鼠标为中心的圆,同时单击鼠标并将其拖过屏幕。圆圈将像喷漆一样绘制在移动的鼠标上。到目前为止,这就是我所拥有的
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 中完成的绘图的形状、颜色、大小和旋转。目前,大小是一个设置为 32 的整数。当用户使用键盘功能中的 'b' 键选择形状时,he/she 可以在用户单击时切换鼠标周围绘制的形状并拖动鼠标。就像喷漆一样。除圆形喷雾外,所有其他形状都围绕着鼠标工作。
此答案假设您的视口和投影矩阵等设置正确,并且此函数的输入考虑了 "screen coordinates"(鼠标使用的)不相同的事实"OpenGL Coordinate Space"(这通常意味着将一个或另一个反转 y 轴的方向)。
您用于设置顶点坐标的数学运算有误。鼠标的 x
和 y
坐标不应乘以 sine/cosine 函数。
正确的写法是
glVertex2f((size/2) * cos(theta) + x, (size/2) * sin(theta) + y);
我还要补充一点,您似乎仍在使用 OpenGL 的即时模式渲染,该渲染已被弃用,并且会为专业设置提供极差的培训。我强烈建议您学习 Modern OpenGL (3.x+),并将这些概念重新应用到您已经从事的任何项目中。 This is a very good tutorial.
我正在尝试使用函数 mouseMove(int x, int y) 绘制一个以鼠标为中心的圆,同时单击鼠标并将其拖过屏幕。圆圈将像喷漆一样绘制在移动的鼠标上。到目前为止,这就是我所拥有的
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 中完成的绘图的形状、颜色、大小和旋转。目前,大小是一个设置为 32 的整数。当用户使用键盘功能中的 'b' 键选择形状时,he/she 可以在用户单击时切换鼠标周围绘制的形状并拖动鼠标。就像喷漆一样。除圆形喷雾外,所有其他形状都围绕着鼠标工作。
此答案假设您的视口和投影矩阵等设置正确,并且此函数的输入考虑了 "screen coordinates"(鼠标使用的)不相同的事实"OpenGL Coordinate Space"(这通常意味着将一个或另一个反转 y 轴的方向)。
您用于设置顶点坐标的数学运算有误。鼠标的 x
和 y
坐标不应乘以 sine/cosine 函数。
正确的写法是
glVertex2f((size/2) * cos(theta) + x, (size/2) * sin(theta) + y);
我还要补充一点,您似乎仍在使用 OpenGL 的即时模式渲染,该渲染已被弃用,并且会为专业设置提供极差的培训。我强烈建议您学习 Modern OpenGL (3.x+),并将这些概念重新应用到您已经从事的任何项目中。 This is a very good tutorial.