OpenGL用鼠标移动画圆
Posted
技术标签:
【中文标题】OpenGL用鼠标移动画圆【英文标题】:OpenGL draw circle with Mouse Move 【发布时间】:2016-09-07 15:53:22 【问题描述】:我正在尝试使用函数 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 的 int。当用户在键盘功能中使用“b”键选择形状时,他/她可以在用户单击并拖动鼠标时切换鼠标周围绘制的形状大约。就像喷漆一样。除圆形喷雾外,所有其他形状都围绕鼠标成型。
【问题讨论】:
这可能是因为您的相机已关闭。消歧:就位置而言。 这个函数内部还有其他形状的if语句,例如正方形和三角形。所有这些都正确绘制。这是唯一一个关闭的。 我认为在问题中包含您的投影是如何制作的(正交或透视?尺寸?Fov?) 【参考方案1】:此答案假定您的视口和投影矩阵之类的设置正确,并且此函数的输入考虑了“屏幕坐标”(鼠标使用的)与“ OpenGL 坐标空间”(这通常意味着将 y 轴的方向反转为一个或另一个)。
您用于设置顶点坐标的数学是错误的。鼠标的x
和y
坐标不应乘以正弦/余弦函数。
正确的写法是
glVertex2f((size/2) * cos(theta) + x, (size/2) * sin(theta) + y);
我还要补充一点,您似乎仍在使用 OpenGL 的即时模式渲染,该渲染已被弃用,并且会为专业设置提供极差的培训。我强烈建议您学习现代 OpenGL (3.x+) 并将这些概念重新应用到您已经从事的任何项目中。 This is a very good tutorial.
【讨论】:
我试过了,但我看不到圆圈。我想我的相机是关闭的,但我没有编写任何代码来改变它的默认值。 您必须提供代码来解释如何设置投影矩阵。圆圈被渲染到超出窗口边界的可能性非常大,因为 OpenGL 坐标空间是[-1, 1]
,但屏幕/窗口坐标是[0, window_size)
。设置为(0, framebuffer_width, 0, framebuffer_height, -1, 1)
的正交投影矩阵可能会解决这个问题。以上是关于OpenGL用鼠标移动画圆的主要内容,如果未能解决你的问题,请参考以下文章