好的,所以我的程序打开一个文件,读入xyz-points,然后从中绘制一条线条。我最初用SharpGL编写的这个程序(实现为WPF窗口)并且它工作正常,但由于使用立即模式不好,所以我已经转向使用C ++的OpenGL。我(有点)想出了VBO,现在我正在尝试添加鼠标功能。我的问题是我无法用鼠标移动图片,我希望能够点击并拖动'图片。我的mouseClickFunc和mouseMotion工作(我的cout语句执行),但似乎我的翻译调用永远不会被执行(即图片开始部分'剪切'在场景中,我希望能够拖动它和以它为中心)。我知道这是在黑暗中拍摄但我真的不知道该怎么做。
MotionFunc:
void mouseMotion(int x, int y)
{
if (moveable)
{
xMove += xTransform(x) - xTransform(xDown);
yMove += yTransform(y) - yTransform(yDown);
xDown = x;
yDown = y;
cout << yMove << "---" << xMove << endl;
glutSwapBuffers();
glutPostRedisplay();
}
}
显示功能:
void RenderFunction(void)
{
++FrameCount;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
// Reset the modelview matrix.
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
glPopMatrix();
glutSwapBuffers();
glutPostRedisplay();
}
我确信我需要展示更多代码,这就是我认为问题所在。任何帮助将不胜感激。
这是我看到的控制台输出和屏幕(OpenGL上下文)的图片。
更新:更新了我的代码。看起来我的坐标正在移动,但如果这是有意义的,那就不是图片。如果你查看我的输出,如果我继续拖动&#39;图片中,您可以在控制台中看到变量xMove和yMove可以根据需要变大或变小,再次翻译就是永远不会移动它。
答案 0 :(得分:0)
在绘制图形之前弹出矩阵,将矩阵重置为最后一个推动矩阵的状态。在绘制调用下方移动glPopMatrix();
答案 1 :(得分:0)
您在拨打glDrawArrays()
之前弹出矩阵,这自然会否定翻译的效果。它也会否定glOrtho()
调用,但这应该在投影矩阵上发布,而不是首先在模型视图矩阵上发布。
答案 2 :(得分:0)
当然,问题在于您的代码,而不是OpenGL。
在此代码摘录中:
glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
glPopMatrix();
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
你是:
因此,您的翻译将被忽略。
这是正确的操作:
glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
glPopMatrix();
答案 3 :(得分:0)
你在翻译之前将投影相乘,记得总是在OpenGL 1.1中读取从Bottome到top的矩阵变换,你应该升级IMO。另一个问题是你在绘制之前弹出矩阵。
正确的代码:
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
// Reset the modelview matrix.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
glPopMatrix();