如何在openGL C ++中使用glTranslatef

时间:2016-03-27 10:44:28

标签: c++ opengl

我尝试制作一个简单的程序,用户可以通过鼠标拖动来移动多边形。但它在“translatef”根本不起作用.. 怎么解决这个问题? 我的源代码在这里。

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    MyProject/Program.cs

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   MyProject/MyProject.csproj

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    MyProject/Program.cs

1 个答案:

答案 0 :(得分:2)

glTranslatef((mouseX - x), (mouse - y), 0.0);
glutPostRedisplay();
glPopMatrix();

glutPostRedisplay标记GLUT的主循环,以便尽快再次调用显示功能。这意味着现在不会调用显示功能,但是后来当主循环决定时(例如,一旦事件处理结束就调用此框架的显示功能)。

因此,在推送和弹出矩阵之间调用glutPostRedisplay时,实际调用显示函数时不会有任何改变。而且,在同一个函数中调用glutPostRedisplay两次没有任何意义。正如我所说,只有标志主循环才能运行此帧的显示功能,因此标记两次将无效。

我建议您尽可能将模型矩阵变换保留在显示功能(或相关功能)中。将glTranslatefglScalef传播到事件处理函数中会使维护或了解场景的内容变得更加困难。此外,将变换保持在同一位置使您更容易进行更改并向场景添加新对象,否则将无法管理。

相反,您应该存储应用这些翻译所需的所有数据,并将它们放在显示功能中。比如说,您需要将对象转换为鼠标的屏幕位置吗?存储这些坐标:

// Declared somewhere accessible
float objectX, objectY;
...
// Mouse handling function
objectX = (mouse - x);
objectY = (mouse - y);
...
// Display (or related) function
glTranslatef( objectX, objectY, 0.0f );
drawObject();

注意我只提到对模型矩阵这样做。设置投影矩阵非常常见(仅在窗口调整大小时)并且很好。除非你有一个非常具体的模型视图转换应用于所有对象(甚至那时),你应该遵循我的建议。

请注意,您未正确使用矩阵模式。当您应将变换应用于模型视图矩阵时,您可以将变换应用于投影矩阵。你应该真正了解矩阵是如何工作的。搜索投影查看模型矩阵,转换查看卷。 此外,学习现代OpenGL而不是弃用的功能可能更有用。