PDA

View Full Version : 3d Animated character hints using qt/opengles


lcuk
04-28-2010, 03:39 PM
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]

festivalnut
04-28-2010, 03:47 PM
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

lcuk
04-28-2010, 03:54 PM
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.

festivalnut
04-28-2010, 03:58 PM
stickwoman! :)

lcuk
04-28-2010, 04:01 PM
festivalnut - i already have stickwomen!
at about 30 seconds in my tracy drawing is here http://www.youtube.com/watch?v=6Z51-vCa0_Q

festivalnut
04-28-2010, 04:07 PM
lol a rotating stickwoman! i'm liking it!

RevdKathy
04-28-2010, 04:08 PM
Please could you make it a meego bear? I'd love a bear wandering around my screen. :)

lcuk
04-28-2010, 04:12 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 ...

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

lcuk
04-28-2010, 04:24 PM
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!)

lcuk
04-28-2010, 04:29 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?

lcuk
04-28-2010, 06:00 PM
I did some searching and am going to play with this code a little bit

it uses pygame and makes a doody spinning globe with just a short script :)
the guy has been working on other things too, really cool to see
http://talk.maemo.org/showthread.php?p=553175#post553175

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)

benj5386
04-29-2010, 06:49 AM
Can we have a paperclip?

noobmonkey
04-29-2010, 07:00 AM
lcuk - http://johanneskuhlmann.de/blog/2010/04/28/3d-on-the-nokia-n900-through-head-tracking/ (i know double posting) :D - i want, nay i demand a desktop moving background that will track my ugly face and have stick women dancing! :D hehe

lcuk
04-29-2010, 09:48 AM
lcuk - http://johanneskuhlmann.de/blog/2010/04/28/3d-on-the-nokia-n900-through-head-tracking/ (i know double posting) :D - i want, nay i demand a desktop moving background that will track my ugly face and have stick women dancing! :D hehe


the screen will crack if it tries to track your face :p

but yeah thats a really cool effect - the facial tracking alone would be cool
getting that in place on the main camera would be amazing
(for other things i'm thinking)

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_())

lcuk
04-29-2010, 06:25 PM
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).

lcuk
05-01-2010, 09:15 AM
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?

maxximuscool
05-01-2010, 09:27 AM
This remind me of the EyeToy PS. and Wii lol. Plug the N900 to the TV and then use the main camera to play game :) this isn't a bad idea.