Oktober 2007
Papervision3D, Flash und Konsorten
Endlich erhält Flash in Sachen 3D ganz neuen Tiefgang
Frei begehbare 3D-Räume sind jetzt auch mit Flash möglich. Wie das funktioniert? Papervision3D macht es möglich...
Text: Frank Reitberger
Frei drehbare 3D-Würfel sind wie das obligatorische Kaninchen, das neuerdings ein jeder ohne Probleme aus dem Hut zaubert. Wie spannend ist das also noch? Absolut frei begehbare 3D-Räume, die beispielsweise als Showroom fungieren und in denen dann komplett texturierte Einrichtungskollektionen präsentiert und erlebbar werden, sind da wohl eher die Ausnahme denn die Regel. Wäre das nicht mal eine gelungene Abwechslung? An dieser Stelle sendet Flash endlich kein Testbild mehr, sondern füllt die z-Achse, dank Papervision3D, mit exquisitem Programm!
Unter der Vielzahl an Verwendungsmöglichkeiten der Open Source 3D-Engine für Flash werden hier zwei Varianten genauer unter die Lupe genommen:
- mit einem komplexen 3D-Charactermodell in Flash arbeiten
- Flashvideo-Streams direkt auf 3D-Objekte projizieren
Eine gute Figur machen...
Ersetzen wir also zuerst den schon leicht angestaubten 3D-Würfel durch ein etwas aufwändigeres 3D-Charactermodell. Ich habe da mal was vorbereitet und in einem 3D-Programm meiner Wahl schnell ein paar Polygone in Form gebracht, texturiert und anschließend für den Import in Flash vorbereitet (3D-relevante Dateien liegen diesem Artikel bei).
Wer die Wahl hat, hat die Qual
Es gibt viele Möglichkeiten, um an ein 3D-Modell zu kommen, welches dann in Flash verwendet werden kann. Zum einen kann man der hausinternen 3D-Abteilung so lange auf den Wecker fallen, bis diese entnervt ein Modell herausrückt, um wieder in Ruhe arbeiten zu können. Zum anderen sollte man aber die Alternative in Betracht ziehen, es selbst mal auszuprobieren. In einem 3D-Programm seines Vertrauens (Studio Max 3D, Autodesk Maya, um schnell mal einige zu nennen) ein kleines 3D-Modell zu entwickeln, ist mit ein wenig Übung gar nicht so schwer und man bekommt so auch recht schnell brauchbare Resultate zustande. Zu beachten ist hierbei nur, dass das ausgewählte Programm auch über einen Collada-Exporter verfügt.
Collada... ist kein neuer Cocktail
Collada basiert auf XML und soll sich als offenes Austauschformat für Daten zwischen diversen 3D-Programmen etablieren. Hierbei werden nicht nur Modelle und Texturen weitergegeben, sondern auch spezifische Settings zwischen den 3D-Programmen ausgetauscht. Das heißt im Klartext, das in Maya entwickelte 3D-Modell wird über den Collada-Export exportiert und dann z.B. in 3D Studio Max wieder importiert. Die zuvor gesetzten Eigenschaften der 3D-Objekte, beispielsweise die Texturen, bleiben dabei erhalten, dafür ist das Format vorgesehen. Papervision3D kann übrigens auch mit Collada-Dateien umgehen, klingelt da was?
rootNode = scene.addChild( new Collada("grid_only"),"rootNode" );
Da die Papervision3D Engine über eine Methode zum Collada-Import verfügt, ist das Collada-Format eben auch prima für den Import in Flash zu gebrauchen. Importieren wir nun doch einfach mal unser 3D-Austauschformat in Flash und arbeiten dort damit weiter.
// klassen importierenimport flash.events.*;import flash.display.Sprite;import org.papervision3d.scenes.*;import org.papervision3d.objects.*;import org.papervision3d.cameras.*;import org.papervision3d.materials.*;import org.papervision3d.events.*;// vartypes definierenvar container :Sprite;var scene :Scene3D;var camera :Camera3D;var rootNode :DisplayObject3D;// setup 3d object & camerafunction init(){// sprite erzeugen und als// virtuelle bühne benutzenthis.container = new Sprite();addChild( this.container );this.container.x = stage.stageWidth/2;this.container.y = stage.stageHeight/2;// 3D scene initialisierenthis.scene = newScene3D(this.container);// kamera hinzufügencamera = new Camera3D();camera.x = 3000;camera.z = -2000;camera.zoom = 12;camera.focus = 12;// leeres object namens "rootNode"// zu der scene hinzufügen welches// dann das collada-file lädtrootNode = scene.addChild(new Collada("grid_only.DAE"), "rootNode" );// scene rendernthis.addEventListener(Event.ENTER_FRAME,render3D);}init();
































