Juli 2009
3D-Landschaften: Papervision3D, Flash 10 & O3D
Fortsetzung, Teil 3
Die Flash-Player-10-Variante…
…ist um einiges rudimentärer, da man sich hierbei alle benötigten Methoden und Funktionen noch selbst schreiben muss. Auch handelt es sich bei dieser Variante um keine 3D-Engine, sondern mehr um ein funktionelles Umfeld, das perspektivisch korrekte Verzerrungen erlaubt. Trotzdem sieht das im Ergebnis wirklich ansprechend aus und ist derzeit (noch) performanter als das landschaftliche PV3D-Pendant.
All der Einfachheit zum Trotz, gibt es auch für Flash 10 schon ein paar hervorragende Klassen, die uns das Erstellen und Bearbeiten von Polygonnetzen stark erleichtern. In diesem Zusammenhang darf der LinkedGrid-Ansatz von Petri Leskinen nicht unerwähnt bleiben. Ähnlich der schon bekannten LinkedList, gewährt das LinkedGrid eine bequeme Kontrolle über jeweilig voranstehende bzw. nachfolgende Nodes innerhalb eines Polygonnetzes. Dieser Ansatz ist nicht nur performant, sondern bietet zusätzlich eine Sortierungs-, Iterations- und Render-Funktion sowie wirklich luxuriösen Zugriff auf einzelne Vertices. So lassen sich beispielsweise über die Funktion grid.forEach() problemlos eigene Methoden auf jedes Einzelteil innerhalb des Netzes anwenden (Listing 3), (Abb. 2)
private var tim:Number = 0.0, counts:int =0;private function enterFrame(e:Event = null):void {tim -= getTimer();for (var k:int = 0; k != 2;++k) {grid.forEach(function (item:GridItem):void { item.mass = item.az = 0.0 } );grid.forEach(updateItem2);var item:GridItem = grid.firstItem;while ((item = item.itemRight).itemRight) item.az = 0.111111;while ((item = item.itemBelow).itemBelow) item.az *= 0.111111;while ((item = item.itemBelow).itemBelow) item.az *= 0.111111;while ((item = item.itemRight).itemRight) item.az *= 0.111111;if (useMass) grid.forArea(updateItem3);grid.forEach(updateItem4);}tim += getTimer();++counts;render();}public function render(e:Event = null) :void {var checkX:Vector.<Boolean> = new Vector.<Boolean>(grid.gridSize),checkY:Vector.<Boolean> = new Vector.<Boolean>(grid.gridSize);grid.forEach(function (item:GridItem):void {checkX[item.id] = (grid.vertices2D[item.id << 1] > -30 + Math.random()*60);checkY[item.id] = (grid.vertices2D[(item.id << 1)+1] > -30 + Math.random()*60);});var bounce:Number = 4.0;var strong:Boolean = false;var tr:GridTriangle;for (var i:int = grid.triangles.length; --i != -1; ){tr = grid.triangles[i];if (!(checkX[tr.id0] == checkX[tr.id1] &&checkX[tr.id0] == checkX[tr.id2])) {if (!(checkY[tr.id0] == checkY[tr.id1] &&checkY[tr.id0] == checkY[tr.id2])) {tr.point0.bounce(bounce);if (strong) tr.point1.bounce(bounce);if (strong) tr.point2.bounce(bounce);= 0;}}}viewMatrix.prependRotation( 4.0*mouseX/this.w, new Vector3D(0, 0, 1));grid.render(graphics, light, viewMatrix);}
Darüber hinaus
Keine Frage: Bei Flash hat sich in den letzten Jahren in Sachen 3D einiges getan. Andernorts wurde allerdings schon eine Menge mehr entwickelt. Mit Unity3D (http://www.unity3d.com/) oder Google O3D (http://code.google.com/intl/de-DE/apis/o3d/)
stehen ausgereifte Alternativen für 3D-getriebene-Internetanwendungen zur Verfügung. Unity3D erweist sich mit Shadern, Physics, Audio & Video, integriertem Editor etc. als mächtiges und komfortables Tool, während Google O3D als Open Source JavaScript API vom Ansatz her nicht weniger attraktiv erscheint.
Beide Alternativen haben jedoch leider einen großen Nachteil: Sie sind nur über ein weiteres Browser-Plug-in sichtbar. Und die Verbreitung solch "neuer" Plug-ins schreitet für gewöhnlich nur sehr schleppend voran. Wodurch dank weltweit flächendeckender Verbreitung des Plug-ins, der Einsatz Flash-basierter 3D-Lösungen nach wie vor am vorteilhaftesten sein dürfte.
Gerade mit Blick auf...
- ein zukünftig kommendes Papervision-Update ("PapervisionX"), das bestimmt eine Menge der neuen Flash-Player-10-Features aufgreift;
- eine Vielzahl alternativer 3D-Engines wie Away3D oder Alternative3D;
- und ein eigens via Pixel Bender für Flash entwickeltes Shader
sieht die Zukunft für Flash-3D-gestützte Anwendung also gar nicht so schlecht aus.
Frank Reitberger arbeitet und entwickelt als Flash-Teamleiter für anyMOTION GRAPHICS Internet- und Offlineanwendungen im B2C- und B2B-Bereich. Frank (reitberger@anymotion.de) veröffentlicht unter seinem Nickname "pwdVergesser" auch viele seiner kleinen Flash Snippets im Flashforum sowie in seinem Blog www.prinzipiell.com.


























