Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用鼠标移动OpenGL绘制圆_C++_Opengl_Geometry_Glut - Fatal编程技术网

C++ 用鼠标移动OpenGL绘制圆

C++ 用鼠标移动OpenGL绘制圆,c++,opengl,geometry,glut,C++,Opengl,Geometry,Glut,我试图使用mouseMove函数(intx,inty)在屏幕上单击并拖动鼠标时,以鼠标为中心绘制一个圆。将在移动的鼠标上绘制圆圈,就像喷漆一样。到目前为止,这就是我所拥有的 void mouseMove(int x, int y) { glBegin(GL_POLYGON); for (int i = 0; i <= 360; i++) { float theta = (2 * 3.14 * i) / 360;

我试图使用mouseMove函数(intx,inty)在屏幕上单击并拖动鼠标时,以鼠标为中心绘制一个圆。将在移动的鼠标上绘制圆圈,就像喷漆一样。到目前为止,这就是我所拥有的

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();
}
void mouseMove(int x,int y){
glBegin(GL_多边形);

对于(int i=0;i此答案假设视口和投影矩阵等设置正确,并且此函数的输入考虑到“屏幕坐标”(鼠标使用的坐标)与“OpenGL坐标空间”不同这一事实(这通常意味着反转一个或另一个的y轴方向)

用于设置顶点坐标的数学错误。鼠标的
x
y
坐标不应乘以正弦/余弦函数

正确的书写方法是

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

我还想补充一点,您似乎仍然在使用OpenGL的即时模式渲染,这是不推荐使用的,并且将为专业设置提供极差的培训。我强烈建议您学习现代OpenGL(3.x+)并将这些概念重新应用到您正在处理的任何项目中。

此答案假设视口和投影矩阵等设置正确,并且此函数的输入考虑到“屏幕坐标”(鼠标使用的坐标)与“OpenGL坐标空间”不同这一事实(这通常意味着反转一个或另一个的y轴方向)

用于设置顶点坐标的数学错误。鼠标的
x
y
坐标不应乘以正弦/余弦函数

正确的书写方法是

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

我还想补充一点,您似乎仍然在使用OpenGL的即时模式渲染,这是不推荐使用的,并且将为专业设置提供极差的培训。我强烈建议您学习现代OpenGL(3.x+)然后将这些概念重新应用到您正在处理的任何项目中。

这可能是因为您的相机已关闭。消除歧义:在位置方面。此函数中还包含其他形状(如正方形和三角形)的if语句。所有这些都正确绘制。这是唯一一个关闭的。我认为包括在内是相关的在这个问题中,你的投影是如何进行的(正交还是透视?尺寸?视野?)这可能是因为您的相机已关闭。消除歧义:在位置方面。此函数中还包含其他形状(如正方形和三角形)的if语句。所有这些都正确绘制。这是唯一一个关闭的。我认为在问题中包括投影是如何生成的是相关的(正交或透视?尺寸?视野?)我试过了,但看不到圆。我想我的相机已关闭,但我还没有编写任何代码来更改默认设置。那么,您必须提供代码来解释投影矩阵是如何设置的。圆的渲染可能会超出窗口的边界,因为OpenGL坐标空间是
[-1,1]
但屏幕/窗口坐标是
[0,窗口大小)
。正交投影矩阵设置为
(0,帧缓冲区宽度,0,帧缓冲区高度,-1,1)
可能会解决这个问题。我尝试过这个,但看不到圆。我想我的相机已关闭,但我还没有编写任何代码来更改默认设置。那么,您必须提供代码来解释投影矩阵是如何设置的。圆的渲染可能会超出窗口的边界,因为英语坐标空间是
[-1,1]
但屏幕/窗口坐标是
[0,窗口大小)
。设置为
(0,帧缓冲区宽度,0,帧缓冲区高度,-1,1)
的正交投影矩阵可能会解决这个问题。