Название: OGRE RenderWindow и Qt4
Отправлено: w63f от Июль 15, 2009, 11:26
Здравствуйте! Пытаюсь прикрутить OGRE к Qt. Использую для этого Python-Ogre и PyQt4 соответственно. Воспользовавшись примером c сайта про python-ogre у меня получилось следующее: from PyQt4 import QtOpenGL,QtCore,QtGui import ogre.renderer.OGRE as Ogre import sys
class OgreScene (QtGui.QGraphicsScene): def __init__(self,parent = None): QtGui.QGraphicsScene.__init__(self,parent) self.root = None self.renderwindow = None self.camera = None self.viewport = None self.scene = None self.setRoot() self.preload() self.timer = QtCore.QTimer(self) self.connect(self.timer,QtCore.SIGNAL("timeout()"),self,QtCore.SLOT("update()")) self.timer.start(100)
def setRoot(self): self.root = Ogre.Root("plugins.cfg","ogre.cfg","ogre.log") if self.root.restoreConfig() or self.root.showConfigDialog(): self.root.initialise(False) self.connect(self, QtCore.SIGNAL("sceneRectChanged(const QRectF &)"), self.handleResize)
def preload(self): hello = QtGui.QDialog() hello.setWindowOpacity(0.8) hello.setWindowTitle("Hello, world!") hello.setLayout(QtGui.QVBoxLayout()) label = QtGui.QLabel(QtCore.QString("Hullo.")) hello.layout().addWidget(label) self.addWidget(hello) for item in self.items(): item.setFlag(QtGui.QGraphicsItem.ItemIsMovable) item.setCacheMode(QtGui.QGraphicsItem.DeviceCoordinateCache) item.setPos(QtCore.QPointF(0, 0))
def handleResize(self,rect): if self.renderwindow: #self.renderwindow.resize(int(rect.x()*100.0), int(rect.y()*100.0)) self.renderwindow.windowMovedOrResized()
def drawBackground(self,painter,rect): if self.renderwindow == None: #assert(self.painter.paintEngine().type() == QtGui.QPaintEngine.OpenGL) self.initOgre(); self.root.renderOneFrame()
def initOgre(self): params = Ogre.NameValuePairList() #params['currentWindowHandle'] = Ogre.UTFString("0") params["currentGLContext"] = Ogre.UTFString("True") self.renderwindow = self.root.createRenderWindow("MainRenderWindow", 640, 480, False, params) if self.renderwindow == None: print 'Error: Render window doesn\'t init!' return #self.renderwindow.setVisible(True) self.loadResources() self.scene = self.root.createSceneManager("DefaultSceneManager", "g3d SceneManager") self.camera = self.scene.createCamera("g3d Camera") self.viewport = self.renderwindow.addViewport(self.camera) self.viewport.setBackgroundColour(Ogre.ColourValue(0.1, 0.1, 0.1, 1.0)) self.scene.setAmbientLight(Ogre.ColourValue(0.5, 0.5, 0.5)) l = self.scene.createLight("MainLight") l.setPosition(200, 80, 100) l.setDiffuseColour(Ogre.ColourValue(1.0, 0.5, 0.0)) sphereEnt = self.scene.createEntity("Sphere", "sphere.mesh") sphereNode = self.scene.getRootSceneNode().createChildSceneNode("SphereNode")
sphereNode.setVisible(True) sphereNode.attachObject(sphereEnt) sphereNode.setPosition(0, 0, 0) self.camera.setPosition(50, 50, 400) self.camera.lookAt(50, 50, 400) self.renderwindow.setVisible(True) print 'Ogre has been inited'
def loadResources(self): config = Ogre.ConfigFile() config.load('resources.cfg') seci = config.getSectionIterator() while (seci.hasMoreElements()): secName = seci.peekNextKey() settings = seci.getNext() for i in settings: typeName = i.key archName = i.value Ogre.ResourceGroupManager.getSingleton().addResourceLocation(archName,typeName,secName) Ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups()
if __name__ == "__main__": app = QtGui.QApplication(sys.argv) mwin = QtGui.QWidget() scene = OgreScene() gr = QtGui.QGridLayout() view = QtGui.QGraphicsView(scene) gr.addWidget(view,0,0) mwin.setLayout(gr) mwin.show() sys.exit(app.exec_())
Результат выполнения можно увидеть во вложении. Им является пара окон: qt's mainwindow и OGRE's renderwindow. Да, оно работает. Работает нормально. Единственное, что меня не устраивает, так это то, что огровский renderwindow висит вне кьютишного окна. Вопрос заключается в том, можно ли его поместить в область окна, и если да, то как это сделать?
|