OpenGL翻译不起作用

时间:2014-03-14 15:39:19

标签: c++ opengl freeglut translate-animation

好的,所以我的程序打开一个文件,读入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上下文)的图片。 Here is a picture of a console output and the screen (OpenGL context) as I see it.

更新:更新了我的代码。看起来我的坐标正在移动,但如果这是有意义的,那就不是图片。如果你查看我的输出,如果我继续拖动&#39;图片中,您可以在控制台中看到变量xMove和yMove可以根据需要变大或变小,再次翻译就是永远不会移动它。

You can see my translate coordinates can get as big or small as they want, which would make the object unmoveable, but it doesn't move.

4 个答案:

答案 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);
你是:

  1. 将身份设置为视图矩阵
  2. 将其推入队列
  3. 通过glTranslate修改它
  4. 弹出堆栈
  5. 渲染图片
  6. 因此,您的翻译将被忽略。

    这是正确的操作:

    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();