【问题标题】:OpenGL translate not workingOpenGL翻译不起作用
【发布时间】:2014-04-20 00:20:15
【问题描述】:

好的,所以我的程序打开一个文件,读取 xyz 点,然后从中画出一条线。我最初用 SharpGL(实现为 WPF 窗口)编写了这个程序,它可以工作,但由于使用立即模式而效果不佳,所以我已经转移到 C++ 中的 OpenGL。我已经(有点)想出了 VBO,现在我正在尝试添加鼠标功能。我的问题是我无法用鼠标移动图片,我希望能够单击并“拖动”图片。我的 mouseClickFunc 和 mouseMotion 工作(我的 cout 语句执行),但是似乎我的翻译调用从未被执行(即图片在场景中开始部分“剪辑”,我希望能够拖动它并将其居中)。我知道这是在黑暗中拍摄,但我真的不知道该怎么做。

运动功能:

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 上下文)的图片。

更新:更新了我的代码。看起来我的坐标在移动,但如果这有意义的话,图片不是。如果您查看我的输出,如果我继续“拖动”图片,您可以在控制台中看到变量 xMove 和 yMove 可以随心所欲地变大或变小,再次翻译就是永远不会移动它。

【问题讨论】:

    标签: c++ opengl freeglut translate-animation


    【解决方案1】:

    在绘制之前弹出矩阵,这会将矩阵重置为最后一次推送矩阵的状态。将glPopMatrix(); 移动到绘图调用下方

    【讨论】:

    • 试过了,没有任何反应。
    【解决方案2】:

    你在调用glDrawArrays() 之前弹出了矩阵,所以这自然会否定翻译的效果。它还否定了glOrtho() 调用,但它应该首先在投影矩阵上而不是在模型视图矩阵上发出。

    【讨论】:

      【解决方案3】:

      当然,问题出在您的代码中,而不是在 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. 渲染图像

      因此,您的翻译将被忽略。

      这是正确的操作:

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

      【讨论】:

      • 我已经切换了我的 glPopMatrix,但仍然没有发生任何事情,Idea?
      【解决方案4】:

      您在翻译之前乘以投影,请记住始终在 OpenGL 1.1 中从底部到顶部读取矩阵转换,您应该升级 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();
      

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 2017-10-30
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多