【发布时间】:2012-03-30 15:20:07
【问题描述】:
我想将 Bullet 演示集成到 Qt 应用程序中。我正在使用 Bullet 附带的 Bullet 演示示例,名为 App_BasicDemo。
如果我在没有 Qt 的情况下执行这个应用程序,它会打开一个窗口并且渲染得非常好。所以我想,如果我只是把它作为一个 QGLWidget,它应该在 Qt 窗口中做同样的事情。但它不起作用。
在我的 GLWidget 的构造函数中,我创建了 BasicDemo。在 initializeGL 中,我调用了 BasicDemo 的 myinit 和 initPhysics。最后,在paintGL 中,我调用了clientMoveAndDisplay。
我遇到的第一个问题是调用 swapBuffers 时 clientMoveAndDisplay 会崩溃。
如果我只是评论那行,程序不会崩溃,但它不会显示任何内容。
我错过了什么?
编辑:
void GLWidget::paintGL() {
scene->clientMoveAndDisplay();
QGLWidget::swapBuffers();
}
void BasicDemo::clientMoveAndDisplay(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
float ms = getDeltaTimeMicroseconds();
renderme();
glFlush();
//swapBuffers();
}
void BasicDemo::displayCallback(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderme();
//optional but useful: debug drawing to detect problems
if (m_dynamicsWorld)
m_dynamicsWorld->debugDrawWorld();
glFlush();
swapBuffers();
}
编辑 2:
好的,我想我得到了答案。当我初始化 openGL 时,我必须重塑一次 Demo,因为 Bullet 需要我的小部件的宽度和高度。我猜这是之前在某个 Bullet 方法中完成的,当时它调用了 glutmain...
场景->重塑(this->width,this->height);
成功了。 现在我可以看到我的 Bullet Demo。 (它不会像在独立的 Bullet 应用程序中那样得到更新,但这是另一个问题)
谢谢马丁贝克特!
【问题讨论】:
-
QGLWidget 中有一个 resizeGL 方法应该在第一次绘制之前自动调用,你可以把东西放在那里。有时,如果您的引擎需要分配空间,您需要手动调用它,但执行 resizeGL 非常便宜
标签: c++ qt opengl bulletphysics