Hi,
I know this must be possible on maemo and meego using qt.
i would like to create a simple walking meego character using 3d graphics.
something as simple as possible hopefully using primitive polygons to produce a fast animation.
just wandering around the screen.
how would I do this in qt?
got any hints or guides I could follow?
[note, cross posted from meego forum http://forum.meego.com/showthread.php?t=93]
i have absolutely no idea, but when you do please make it female, i really like the idea but dont want some bloke wandering over my screen all day! :P
Female character avatars have problems on resistive screens - their high heels interact with the widgets and other things around :p
As long as your female meegoid can wear flats I think we could cope!!!
this is just as a test case, I just want to see some simple fun stuff knocking around to give others ideas and the meego characters are cute.
mikec
04-28-2010, 04:18 PM
indeed Kathy :)
i want to kickstart some nice fast graphics so we can use them for all the other things too :)
wandering sheep come to mind once again - we have all the graphics data and some things and we need to make more levels with it, but need simple fast graphics ...
have you looked at the QT Hello demo
http://doc.qt.nokia.com/4.6/opengl-hellogl.html
edit, and the maemo specifics
http://wiki.maemo.org/OpenGL-ES-Game
mikec - which one!
google offers a qt3 version of a walkthrough that the folks in #qt said i shouldnt follow since qt3 is depreciated.
http://www.google.co.uk/search?q=qt+hello
(bah, you edited your post to include some examples, thanks!)
i looked over a load of the qt creator demos on my pc but couldn't at the time get them on my machine
is there something i can do now for my n900?
there are pyqt apps springing up all over the place, but i don't know whether they include enough of the 3d api to be usable.
can you point to one in extras-devel already thats mobile optimized and simple enough to play with and expand on?
(or just use the CODE /CODE blocks and paste some simple pyqt stuff here!)
attila77
04-29-2010, 06:44 AM
there are pyqt apps springing up all over the place, but i don't know whether they include enough of the 3d api to be usable.
Both PySide and PyQt use PyOpenGL for the OpenGL heavy lifting, but that is AFAIK still not generally available on the N900 (sadly). However, if you just need GL-accelerated QGraphicsView/QGLWidgets, that's working already under PyQt (prolly PySide, too, but I didn't check)
mikec
04-29-2010, 05:51 PM
mikec
can i use the new qt sdk to do this sort of thing easily?
will the preincluded examples be simply runnable on the device?
Apologies have been in meetings all day.
Pygame is nice and portable, and sits ontop of the SDL GL stuff.
For Qt3D
I use the pyside demos and just replace the import statements with pyqt.
http://www.gitorious.net/pyside-examples
the hello qt application is there. The QGL widget will do the rendering, but I could not find the Python GL libs which this demo uses to create the 3d object . @atilla might know more about this.
As I know you are a lazy B*** here is the code
#!/usr/bin/env python
"""PySide port of the opengl/hellogl example from Qt v4.x"""
import sys
import math
from PySide import QtCore, QtGui, QtOpenGL
try:
from OpenGL import GL
except ImportError:
app = QtGui.QApplication(sys.argv)
QtGui.QMessageBox.critical(None, "OpenGL hellogl",
"PyOpenGL must be installed to run this example.",
QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default,
QtGui.QMessageBox.NoButton)
sys.exit(1)
class Window(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.glWidget = GLWidget()
self.xSlider = self.createSlider(QtCore.SIGNAL("xRotationChanged(int)"),
self.glWidget.setXRotation)
self.ySlider = self.createSlider(QtCore.SIGNAL("yRotationChanged(int)"),
self.glWidget.setYRotation)
self.zSlider = self.createSlider(QtCore.SIGNAL("zRotationChanged(int)"),
self.glWidget.setZRotation)
mainLayout = QtGui.QHBoxLayout()
mainLayout.addWidget(self.glWidget)
mainLayout.addWidget(self.xSlider)
mainLayout.addWidget(self.ySlider)
mainLayout.addWidget(self.zSlider)
self.setLayout(mainLayout)
self.xSlider.setValue(15 * 16)
self.ySlider.setValue(345 * 16)
self.zSlider.setValue(0 * 16)
self.setWindowTitle(self.tr("Hello GL"))
def createSlider(self, changedSignal, setterSlot):
slider = QtGui.QSlider(QtCore.Qt.Vertical)
slider.setRange(0, 360 * 16)
slider.setSingleStep(16)
slider.setPageStep(15 * 16)
slider.setTickInterval(15 * 16)
slider.setTickPosition(QtGui.QSlider.TicksRight)
self.glWidget.connect(slider, QtCore.SIGNAL("valueChanged(int)"), setterSlot)
self.connect(self.glWidget, changedSignal, slider, QtCore.SLOT("setValue(int)"))
return slider
class GLWidget(QtOpenGL.QGLWidget):
def __init__(self, parent=None):
QtOpenGL.QGLWidget.__init__(self, parent)
self.object = 0
self.xRot = 0
self.yRot = 0
self.zRot = 0
self.lastPos = QtCore.QPoint()
self.trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
self.trolltechPurple = QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)
def xRotation(self):
return self.xRot
def yRotation(self):
return self.yRot
def zRotation(self):
return self.zRot
def minimumSizeHint(self):
return QtCore.QSize(50, 50)
def sizeHint(self):
return QtCore.QSize(400, 400)
def setXRotation(self, angle):
angle = self.normalizeAngle(angle)
if angle != self.xRot:
self.xRot = angle
self.emit(QtCore.SIGNAL("xRotationChanged(int)"), angle)
self.updateGL()
def setYRotation(self, angle):
angle = self.normalizeAngle(angle)
if angle != self.yRot:
self.yRot = angle
self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle)
self.updateGL()
def setZRotation(self, angle):
angle = self.normalizeAngle(angle)
if angle != self.zRot:
self.zRot = angle
self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle)
self.updateGL()
def initializeGL(self):
self.qglClearColor(self.trolltechPurple.darker())
self.object = self.makeObject()
GL.glShadeModel(GL.GL_FLAT)
GL.glEnable(GL.GL_DEPTH_TEST)
GL.glEnable(GL.GL_CULL_FACE)
def paintGL(self):
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
GL.glLoadIdentity()
GL.glTranslated(0.0, 0.0, -10.0)
GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
GL.glCallList(self.object)
def resizeGL(self, width, height):
side = min(width, height)
GL.glViewport((width - side) / 2, (height - side) / 2, side, side)
GL.glMatrixMode(GL.GL_PROJECTION)
GL.glLoadIdentity()
GL.glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0)
GL.glMatrixMode(GL.GL_MODELVIEW)
def mousePressEvent(self, event):
self.lastPos = QtCore.QPoint(event.pos())
def mouseMoveEvent(self, event):
dx = event.x() - self.lastPos.x()
dy = event.y() - self.lastPos.y()
if event.buttons() & QtCore.Qt.LeftButton:
self.setXRotation(self.xRot + 8 * dy)
self.setYRotation(self.yRot + 8 * dx)
elif event.buttons() & QtCore.Qt.RightButton:
self.setXRotation(self.xRot + 8 * dy)
self.setZRotation(self.zRot + 8 * dx)
self.lastPos = QtCore.QPoint(event.pos())
def makeObject(self):
genList = GL.glGenLists(1)
GL.glNewList(genList, GL.GL_COMPILE)
GL.glBegin(GL.GL_QUADS)
x1 = +0.06
y1 = -0.14
x2 = +0.14
y2 = -0.06
x3 = +0.08
y3 = +0.00
x4 = +0.30
y4 = +0.22
self.quad(x1, y1, x2, y2, y2, x2, y1, x1)
self.quad(x3, y3, x4, y4, y4, x4, y3, x3)
self.extrude(x1, y1, x2, y2)
self.extrude(x2, y2, y2, x2)
self.extrude(y2, x2, y1, x1)
self.extrude(y1, x1, x1, y1)
self.extrude(x3, y3, x4, y4)
self.extrude(x4, y4, y4, x4)
self.extrude(y4, x4, y3, x3)
Pi = 3.14159265358979323846
NumSectors = 200
for i in range(NumSectors):
angle1 = (i * 2 * Pi) / NumSectors
x5 = 0.30 * math.sin(angle1)
y5 = 0.30 * math.cos(angle1)
x6 = 0.20 * math.sin(angle1)
y6 = 0.20 * math.cos(angle1)
angle2 = ((i + 1) * 2 * Pi) / NumSectors
x7 = 0.20 * math.sin(angle2)
y7 = 0.20 * math.cos(angle2)
x8 = 0.30 * math.sin(angle2)
y8 = 0.30 * math.cos(angle2)
self.quad(x5, y5, x6, y6, x7, y7, x8, y8)
self.extrude(x6, y6, x7, y7)
self.extrude(x8, y8, x5, y5)
GL.glEnd()
GL.glEndList()
return genList
def quad(self, x1, y1, x2, y2, x3, y3, x4, y4):
self.qglColor(self.trolltechGreen)
GL.glVertex3d(x1, y1, -0.05)
GL.glVertex3d(x2, y2, -0.05)
GL.glVertex3d(x3, y3, -0.05)
GL.glVertex3d(x4, y4, -0.05)
GL.glVertex3d(x4, y4, +0.05)
GL.glVertex3d(x3, y3, +0.05)
GL.glVertex3d(x2, y2, +0.05)
GL.glVertex3d(x1, y1, +0.05)
def extrude(self, x1, y1, x2, y2):
self.qglColor(self.trolltechGreen.darker(250 + int(100 * x1)))
GL.glVertex3d(x1, y1, +0.05)
GL.glVertex3d(x2, y2, +0.05)
GL.glVertex3d(x2, y2, -0.05)
GL.glVertex3d(x1, y1, -0.05)
def normalizeAngle(self, angle):
while angle < 0:
angle += 360 * 16
while angle > 360 * 16:
angle -= 360 * 16
return angle
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
As I know you are a lazy B*** here is the code
ahem! not that lazy, but seeing a block of code here is much easier to handle than running around the whole web!
changing the code to be simply Pyqt4 will not run at all, so I went to install pyside :)
i installed pyside on my device ( http://pastebin.com/GFJYAm2t )
that installed cleanly and in return when running the example it gave me the polite UI error message.
I also cannot find the missing opengl import, i've left some messages around and got the pyside examples from the gitorious repository but they also offer no clues about where it may be.
pyside-qt4-opengl is installed cleanly which I would have guessed should include the baseline gl stuff but no cigar!
anyone else have clues?
this is a certainly a better position than yesterday even with failures :D
attila77
05-01-2010, 04:16 AM
Both PySide and PyQt use PyOpenGL for the OpenGL heavy lifting, but that is AFAIK still not generally available on the N900 (sadly).
For the record, the examples were originally written in PyQt but have been ported to PySide by the PySide team.
There is no hard dependency on PyOpenGL because there is a perfectly valid scenario using QGraphicsView with GL acceleration, for which it is not needed (unlike Qt3D).
For the record, the examples were originally written in PyQt but have been ported to PySide by the PySide team.
There is no hard dependency on PyOpenGL because there is a perfectly valid scenario using QGraphicsView with GL acceleration, for which it is not needed (unlike Qt3D).
Attila77 thanks for the clarification
however from the pyside examples, this is the line which fails:
http://www.gitorious.net/pyside-examples/pyside-examples/blobs/master/examples/opengl/hellogl.py#line10
try:
from OpenGL import GL
except ImportError:
app = QtGui.QApplication(sys.argv)
QtGui.QMessageBox.critical(None, "OpenGL hellogl",
"PyOpenGL must be installed to run this example.",
QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default,
QtGui.QMessageBox.NoButton)
sys.exit(1)
where does the OpenGL module come from?
vBulletin® v3.8.7, Copyright ©2000-2013, vBulletin Solutions, Inc.