多个 QGLWidgets 和 gluUnProject
Posted
技术标签:
【中文标题】多个 QGLWidgets 和 gluUnProject【英文标题】:Multiple QGLWidgets and gluUnProject 【发布时间】:2013-02-05 15:38:23 【问题描述】:我有一个包含两个 QGLWidget 的 QMainWindow。小部件使用默认构造函数并且不共享上下文。这些小部件都显示二维数据并允许单击和拖动。
这可以使用 gluUnproject 并且在创建的第一个 QGLWidget 上运行良好。单击第二个小部件时,一切都按预期工作。但是,当拖动第二个小部件时,移动并不顺畅。更糟糕的是,一旦第二个小部件被拖动,第一个小部件的 gluUnproject 就会偏离一些边距,这与第二个显示器被拖动的方向和距离有关。
我已经尝试在绘图方法开始时、鼠标事件开始时调用 makeCurrent() 以及其中一个、另一个和两者的组合,但没有看到任何改进。
void MyGLWidget::paintEvent(QPaintEvent *event)
glViewport(0, 0, widgetWidth, widgetHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,(GLfloat)((widgetWidth/widgetHeight)),0.1f,-zoomMin);
glTranslatef(camera.x, camera.y, camera.zoom);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//[GL Drawing code]
glGetDoublev( GL_MODELVIEW_MATRIX, _modelview );
glGetDoublev( GL_PROJECTION_MATRIX, _projection );
glGetIntegerv( GL_VIEWPORT, _viewport );
【问题讨论】:
嗨,Alex,您是如何解决这个问题的? 【参考方案1】:确保您传递给 gluUnProject 的视口和矩阵数据与您正在与之交互的小部件相匹配。理想情况下,您在绘制时将它们的副本创建到某个小部件类成员变量中。
【讨论】:
我尝试在绘图时存储模型、投影和视口矩阵,但使用该设置在两个小部件上都出现了抖动。我通过在鼠标事件上获取三个矩阵来获得平滑的移动。在绘制时获取模型和视口,在鼠标事件时获取投影可以让我顺利移动,但不能解决原始问题。 @AlexBarrett:如果您在绘制时获取矩阵时出现抖动,那么您在错误的时间获取矩阵。请发布您迄今为止为此使用的代码。 @AlexBarrett:只要您不操纵绘图代码中的矩阵,就可以按顺序进行检索。 但是投影矩阵不是视图(=相机)变换的正确位置。投影是一种镜头,对投影应用平移和旋转就像您在将相机机身固定在三脚架上的同时围绕相机镜头移动一样。视图 (=camera) 转换进入模型-视图矩阵。 @datenwolf 我有同样的问题,你能告诉我如何确保你传递给 gluUnProject 的视口和矩阵数据与你正在与之交互的小部件相匹配吗?以及如何在绘制时将它们的副本创建到一些小部件类成员变量中?以上是关于多个 QGLWidgets 和 gluUnProject的主要内容,如果未能解决你的问题,请参考以下文章
在 OS X 上的 Qt 4.8.6 中更改 QGLWidgets 的 OpenGL 上下文版本