Echtzeit-Video von einer USB-Kamera zur Textur hinzufügenDas ist etwas sehr Nettes, auch wenn es derzeit nur unter Windows funktioniert (aber ich arbeite an einer Linux-Version!). Es ist eine kleine Erweiterung zu Beispiel 8 - Environmental Bump Mapping mit GLSL Cube Mapping. Das Programm Die Texturen die in dieser Demo verwendet werden sind hier:
Der Code benutzt die tolle Library VideoCapture.py von Markus Gritsch - für Windows. Wenn Du ein ähnlich einfaches Python-Interface für Video4Linux kennst, baue ich das gerne ein. Da ich noch keines gefunden habe, lerne ich gerade den Umgang mit ctype und v4l. Die Museums-Ansicht stammt von http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/stereographics/stereopanoramic/, sie gehört Peter Murphy. Und hier ist ein Video vom Ergebnis - mit einem sehr netten Hamster vor der Kamera: Programm BeschreibungEin einfaches Demo-Programm um das Funktionieren der Libary zu überprüfen wäre from VideoCapture import Device cam = Device() cam.saveSnapshot('image.jpg') Drei Zeilen Code für einen Kamera-Schnappschuss samt Speichern auf der Platte - ist da nicht cool? Es gibt noch eine Menge Optionen und Funktionen um auftretende Spezialfälle zu behandeln, aber ein brauchbares Programm ist erstaunlich einfach zu machen: Kamera Initialisierungfrom VideoCapture import Device try: cam = Device() except: print "No Camera device found" cam = None Frame GrabbingFür jeden OpenGL-Frame den wir darstellen, überprüfen wir, ob von der USB Kamera ein neues Bild vorliegt. Wenn wir eines bekommen (so etwa 30-60 mal pro Sekunde, nicht synchron mit der OpenGL-Darstellung), tragen wir es auf die Cubemap-Textur auf - und zwar mit glTexSubImage2D(), damit wir nur die relevanten Teile der Textur zur Grafikkarte übertragen müssen: if cam: # camera object was successfully initialized snap = cam.getImage() if snap: # a new image is ready from the camera snapstr = snap.tostring( "raw", 'RGBX') glTexSubImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 160, # position within the texture snap.size[0], snap.size[1], # size of the image GL_RGBA, GL_UNSIGNED_BYTE, snapstr ) Ziemlich einfach, wenn man's mal herausgefunden hat Der Rest des Programms basiert überwiegend auf dem vorherigen Beispiel, dort findest Du auch Infos zum Cube Mapping. Es ergeben sich endlose Möglichkeiten - man könnte das Bild der Kamera sogar mit PIL analysieren und das OpenGL Modell darauf reagieren lassen - wie wäre es mit einem Augenpaar, das nicht nur reflektiert, was es sieht sondern auch noch allen Deinen Bewegungen folgt ? |