Einträge zu ‘Tutorial’

Fnfo – Flash Info

30.04.2010

Flash Version Information

Die Flash Version Information ist ein Development und Deployment Tool für Flash Anwendungen.

Implementierung

Die einfache Implementierung erfordert eine Zeile Code.

Fnfo.initialize(this);

Mit BuildInformation Plugin

Fnfo.initialize(this, {versioninfo:FnfoVersion_fnfo.VERSION_FILE } );

Das Resultat ist dieses untere Flash. (Rechts in das Flash klicken und den Context Menüpunkt fnfo anklicken)

This movie requires Flash Player 9

Um die Information zu schliessen einfach nochmal Rechtsklick und fnfo anklicken.

Der Output wäre wie folgt:

Version: 0.0.1
ProjectName: fnfo
VersionNumber: 0.7.0.5-32
BuildTime: 07.04.2010 12:09:00.44
BuildComputer: MARTIN-WORK/martin
PlayerVersion: WIN 10,0,42,34
PlayerDebug: true
PlayerType: PlugIn
PlayerAudio: true
PlayerMp3: true
SystemOs: Windows 7
ScreenResulution: 1680/1050
ExternalInterface: true
ExternalInterfaceObject: null
ReportTime: Wed Apr 7 16:10:20 GMT+0200 2010
ReportExecution: 00:00:04:293
LastError: none
LoadUrl: http://www.guavestudios.com/blog/fnfo-07.swf
SwfVersion: 9
BytesTotal: 14933
StageParam: test1Param = Hello
StageParam: test2Param = World

Die angezeiten Informationen helfen ein Problem genauer zu klassifizieren. Besonders wenn der Kunde eine Fehlermeldung tätigt, kann dieser mit einem Rechtsklick auf einfache Art und Weise wichtige Infos übermitteln. Die wichtigsten Informationen sind oben aufgelistet, können aber beliebig erweitert werden.

Weitere Beispiele finden sich unter: GettingStarted

Plugins

Derzeit sind die meisten Plugins integriert. Eine Plugin Struktur ermöglicht es aber eigene Plugins selbst hinzuzufügen.

Unter anderem arbeite ich derzeit an einem Screenshot Plugin, dass per Knopfdruck einen aktuellen Screenshot der Applikation mit den gesammelten Informationen und einen Zusatztext an einen Server schicken kann. Dies ist besonders hilfreich, um während der Entwicklung schnell und präzise Fehlerinformationen zu sammeln. Seit Flashplayer 10.1 gibt es zudem die Möglichkeit den zuletzt aufgetretenen Fehler zu melden.

Integration in bestehende IDEs

Die einfachste Integration bietet derzeit ein Prebuild Command. Jede IDE die dies unterstützt kann aktuelle Buildinformationen dem SWF beifügen. Zusätzlich generiert das Script (version.bat) eine Versionsklasse in der die Versionsdatei eingespeichert ist. Diese wird, wenn nicht vorhanden direkt im src Ordner erstellt. Damit kann man diese schnell und einfach anbinden.

Prebuild command in Flash Develop:

scripts/version.bat $(OutputName) $(ProjectName) src

Die Buildnummer setzt sich derzeit aus:

{major}.{minnor}.{build}.{svnrevision}-{localbuild}
{major}.{minnor}.{build} gelesen aus {projectswf}.productversion
{svnrevision} wird mit dem WCRev Utilty aus TortoiseSVN ermittelt
{localbuild} erhöht sich jedes mal bei einem lokalen Build und wird in  {projectswf}.buildnr gespeichert

Status

Derzeit befindet sich das Tool in Entwicklung. Vorallem mit dem Flashplayer 10.1 mit Global Errorhandling werden wir eine komfortable “Fehler melden” Möglichkeit einbauen.

Meinen Dank an Guave Studios, dass dieses Projekt ebenfalls Open Source ist.

Links

Tutorial: Timelapse bei ungünstigen Lichtverhältnissen

19.01.2010

Da wir für den Kurzfilm “The Prague Assignment” einen Sonnenaufgang filmen wollten, haben wir uns diesmal eine besondere Technik überlegt, womit sich ein Zeitraffer von der Nacht bis in den Tag erstellen lässt.

Der übliche Workflow für einen Zeitraffer ist im Grunde ja ganz einfach: mit einer Fotokamera Serienbilder aufnehmen. Je nach Geschwindigkeit des Videos stellt man den Zeitabstand zwischen den Aufnahmen ein. Das geht entweder mit einer speziellen Remote Control oder man schliesst die Kamera an einem Laptop an und verwenden ein spezielles Programm (Die meisten Hersteller bieten eine solche Software an).

Das Problem bei einem Sonnenaufgang (oder -untergang) ist folgendes:
Es ist so gut wie unmöglich die Kamera so einzustellen, dass die Nacht nicht unterbelichtet, bzw. der Tag nicht überbelichtet ist. Die einzige Möglichkeit, um das Problem zu lösen, ist mit Automatik zu fotografieren (entweder Shutter- oder Apertureautomatik). Da ergibt sich aber gleich ein neues Problem, nämlich dass der Zeitraffer dann extrem flimmert bzw. flackert. Das liegt daran, dass die Shutter- bzw. Apertureeinstellungen nicht stufenlos sind. Eine Möglichkeit das Flimmern etwas zu verringern ist, wenn man die Belichtungsmessung auf ein Objekt stellt, das sich nicht bewegt. Darum sollte man nicht den Himmel messen, da immer wenn eine Wolke vorbeisaust, das Bild kurz dunkler und dann wieder heller wird. Trotzdem verändern sich mit der Zeit die Lichtverhältnisse und speziell in dem Moment wo die Sonne aufgeht, wird das Video extrem flackern. Und genau dieses Flackern wird sich rein fototechnisch nicht wirklich verhindern lassen.

Es gibt allerdings eine Technik, mit der sich das flackernde Bildmaterial ausgleichen lässt. Nämlich Tone Mapping (bei HDR Bilder).
Das Problem ist allerdings, dass die Fotos die man geschossen hat keine HDR Bilder sind. Wenn man die Fotos aber als RAW speichert, lässt sich daraus recht gut ein “Fake HDR” erzeugen.
Hierbei hilft uns die Software “Photomatix”. Mit einem “Batch Process” (in Photomatix gibt es die Option “Batch Single Files”) lässt sich aus allen Fotos ein Pseudo-HDR erzeugen. Das alleine hilft natürlich noch nicht. Schlussendlich wird uns hier das Tone Mapping das flackern ausgleichen.
Warum? Ganz einfach, weil (einfach ausgedrückt) Tone Mapping in einem Bild die besten “Kontrastverhältnisse” sucht. Wenn ein Foto also etwas heller oder etwas dunkler ist, ist das Optimum meist irgendwo dazwischen.
Hier kann man wieder einen Batch Prozess über die gerade eben erstellten HDR Bilder laufen lassen, aber dieses mal mit Tone Mapping.

Das Ergebnis kann dann so aussehen:
(oben: normale JPGs der Kamera; unten: die bearbeiteten Pseudo HDR Bilder)

Pseudo HDR Timelapse Comparison from Guave Studios on Vimeo.

Wie man sieht ist das Flackern nicht 100 %tig entfernt, vor allem in den dunklen Bereichen, da diese recht stark erhellt wurden. Aber ansonsten kann sich das Ergebnis schon sehen lassen.
Ich denke, wenn man mit den Tone Mapping Einstellungen noch etwas spielt, verschwindet auch noch das bisschen Flackern.

Ich hoffe dieses Tutorial war halbwegs verständlich. Ich habe die einzelnen Arbeitsschritte nicht aufgezählt, da die meisten HDR Programme eigentlich sehr einfach zu bedienen sind. Der selbe Effekt lässt sich übrigens auch mit anderen Programmen erzielen, als mit Photomatix. Falls aber doch Unklarheiten bestehen sollten, könnt ihr gerne Fragen stellen.
Ansonsten wünsche ich viel Spass beim selber Probieren!

fCon Flash Deployment Console

18.06.2009

fcon_logo

Die Flash Deployment Console ist für das Deployment in einem Game oder in einer Webseite gedacht, die während der Laufzeit direkten administrativen Eingriff in die Applikation oder Ablauf brauchen. Vergleichbar ist die fCon mit einer Development Console in einem Spiel. (Vielfach mit ^ aufrufbar).

Applikationskontrolle

Die fCon hat in der Console eine Eingabemöglichkeit (Kommandozeile). So ist es möglich Commands zu registrieren die beispielsweise den Benutzer in ein gewisses Level setzen.

Modifikation von Variablen

Die fCon bietet Möglichkeiten für das setzen von Variablen. Sie bietet vorallem mit Vervollständigung eine Navigation durch alle DisplayObjects.

Deployment Logging

Gerade bei Flash Online Applikationen befinden sich die Logs einer Applikation auf der Nutzerseite. Somit kann die Laufzeit der Applikation nicht überwacht werden. Natürlich kann man die Logstufen FATAL und ERROR  per Reports an den Server übermitteln, aber bei DEBUG und INFO wäre das mengenmässig ein absolutes Problem. Somit kann man als Entwickler direkt vor Ort in das Geschehen der Applikation Einblick nehmen und den aktuellen Fehler in den Logs suchen.

History

Die fCon bietet eine History mit UP and DOWN keys an. Diese kann mit einer Einstellung Lokal automatisch gespeichert werden. Weiteres kann man mit PAGE_UP oder PAGE_DOWN im Logviewer gescrolled werden. Drückt man zusätzlich SHIFT kann man nach ganz oben oder nach ganz unten.

Scripts und Variablen

Zusätzlich ist ein einfaches Scripting und Variablendeffinitionen möglich.

Sicherheit

Da wir nicht jedem auf einer Webseite den Zugriff auf die Console bieten wollen kann mit dem Lockmanager ein Passwort gesetzt werden. Das ganze funktioniert versteckt und ohne Visuelles Feedback. Somit ist es in einer gewissen Weise “geheim” das diese Applikation eine Console bietet. Das Passwort ist selbstverständlich gehashed und somit auch nicht auslesbar.

Ein paar kleine Beispiele

Einfaches Setup

package {
  import com.guavestudios.fcon.ConsoleImpl;
  import flash.display.Sprite;
  import flash.display.StageAlign;
  import flash.display.StageScaleMode;
  import flash.events.Event;
  import flash.text.TextField;
  import flash.text.TextFieldAutoSize;
 
  /**
   * fCon Sample
   * @author maze | guavestudios.com
   */
  public class Main extends Sprite {
 
    public var txt:TextField;
 
    public function Main():void {
      if (stage) init();
      else addEventListener(Event.ADDED_TO_STAGE, init);
    }
 
    private function init(e:Event = null):void {
      removeEventListener(Event.ADDED_TO_STAGE, init);
      // entry point
      stage.scaleMode = StageScaleMode.NO_SCALE;
      stage.align = StageAlign.TOP_LEFT;
 
      ConsoleImpl; //reference the console
      var config:XML=
 
         <![CDATA[crtl+Char.<]]></setting>
         <setting id="Console.trace">false</setting>
         <setting id="AutoCompletion.Key"><![CDATA[Char.<]]>
         true
         true
        ;
      Console.setStage(stage, config); //initialize console
 
      Console.trace("Hello World"); //sample trace
 
      //create a sample textfield
      txt = new TextField();
      txt.autoSize = TextFieldAutoSize.LEFT;
      txt.text = "Open with 'CRTL + &lt;' and completion with '&lt;'";
      addChild(txt);
 
      //register an sample command with textField
      Console.execute(["loadCommand",new SampleCommand(txt)]);
    }
 
    /**
     * sample function
     * @return testString
     */
    public function getString():String {
      return "this is a test String";
    }
  }
}

Um die Console aufzurufen muss man zuerst das Flash aktivieren und CRTL + < drücken. Dieser Shortcut ist frei definierbar mit der Config.

Das kleine Tutorial zeigt einige Funktionen die die Console im jetztigen Status kann. Die ganzen Kommandos können nach der Reihe ausgeführt werden.
Die Console ist gleich darunter eingebettet und ist noch zugeklappt:
Console

This movie requires Flash Player 9

  • Ist die Console offen und das Eingabe Feld aktiviert kann man mit < alle verfügbaren Commandos anzeigen.
  • mit pr und < vervollständigt die Console zu print Leertaste. Danach Hello World eingeben und Enter drücken
  • align help eingeben um eine hilfe über den Align Command darzustellen
  • align bottom eingeben um die Console ganz untem im Flash zu positionieren
  • Wir befinden uns derzeit auf der Stage
  • print $stage.@ und mit < vervollständigen um die verfügbaren Childs der Stage anzuzeigen (nummeriert)
  • weiter schreiben mit 1. und vervollständigen mit <. Wir befinden uns jetzt in der Applikation und sehen die Eigenschaften.
  • Die ganze Zeile kann jetzt weitergeschrieben werden auf print $stage.@0.txt.text und mit Enter ausführen
  • Da wir das Textfeld nocheinmal brauchen können wir es in eine Variable speichern.
  • set textField $stage.@0.txt
  • Wir können jetzt eine Variable modifiziern mit modify $textField.name ‘myTextField’
  • Die Vervollständigung kann auch auf Element Namen reagieren.
  • print $stage.@0.# und mit < vervollständigen. Jetzt wird myTextField als benanntes Item angezeigt. (Listet alle DisplayObjects mit Namen auf)
  • Fertigschreiben print $stage.@0.#myTextField.text
  • Wir können das Textfeld umpositionieren mit modify $textField.y 50
  • Wir haben bei der Initialisierung die Console um “SampleCommand” erweitert. Der Command ist sampleCommand
  • sampleCommand $textField.x $textField.y

Wir haben die Flash Deployment Console mit unseren Applikationen weiterentwickelt und jetzt online verfügbar gemacht.
Im Trunk befinden sich derzeit noch mehr Plugins und Commands die ich bei Zeit vorstellen werde.

fCon on Googlecode.com

Sourcecode für Sample

Das ganze ist OpenSoure und unter MIT Lizenz. Wer mitentwickeln möchte kann sich gerne bei uns melden.

Tutorial: Displacement Map aus Fototextur generieren

15.06.2009

In diesem kleinen Tutorial möchte ich zeigen wie man mit relativ einfachen Arbeitsschritten aus einer normalen Textur eine qualitativ hochwertige Displacement Map generieren kann.

ala

Es gibt diesbezüglich zwar schon ein Programm namens “CrazyBump” (www.crazybump.com), jedoch bin ich mit dessen Ergebnisen nicht immer ganz zufrieden, und deshalb habe ich selber ein bisschen geforscht, wie man Displacement Maps einfach selber generieren kann.

Beim Erstellen von Displecement Maps aus normalen Texturen gibt es ein Problem. Denn, wie es nicht anders sein könnte, stellen Texturen die Farbe und nicht die Tiefe einer Oberfläche dar. Gruben kann man allerdings trotzdem erkennen, da sie sozusagen im Schatten liegen. Diese erscheinen also dunkler als Erhebungen. Das gibt uns einen Hinweis, wie wir die Texturen auswählen sollten. D.h. gleichmässig beleuchtete Oberflächen, bei denen Gruben nicht wirklich dunkler erscheinen werden ein schlechtes Ergebnis geben.
Wenn man also eine Textur total desaturiert hat man im Grund fast schon eine Displacement Map, allerdings ist das Ergebnis viel zu „flach“ und diese Textur kann höchstens als Bump Map dienen.

Warum ist das so? Ganz einfach, weil tiefere Ebenen (oder Gruben) im selben „schwarz-weiss-Bereich“ sind wie hohe Ebenen. Im Bild erscheinen sie zwar dunkler weil bei Gruben mehr dunklere Bereiche sind wie helle. Das Problem ist allerdings, dass kleine Erhebungen in tiefen Ebenen einen selben (oder ähnlichen) Weisswert/Helligkeit haben wie Erhebungen in hohen Ebenen. D.h. sie haben die selbe Höhe. Damit wir also mehr Tiefe in die Map bringen, muss alles was in einer Grube ist grundsätzlich dunkler sein wie alles was auf einer Erhebung ist. Sobald etwas die selbe Helligkeit hat, ist es auch auf der selben Höhe.

Da wir nun wissen was an dieser S/W-Map noch falsch ist bzw. fehlt stellt sich nun die Frage, wie wir das erreichen. Und die Lösung ist im Grunde ganz einfach. Wir filtern die Map nach Detailstufen. D.h. in der ersten und gröbsten Detailstufe interessieren wir uns nicht für die kleinen Grübchen und Kerben, sondern für die grossen „Täler und Berge“. Indem wir also die Map stark weich zeichnen (also z.b. mit einem Gaussian Blur) werden diese kleinen Details verwischt und nur die grobe Struktur bleibt übrig.

Vorher empfehle ich übrigens die ganze Komposition auf 16bit-Mode zu stellen, weil Displacement Maps grundsätzlich hohe Bit-tiefen benötigen.
Da mit diesem Effekt (Weichzeichnen) aber der Kontrast verringert wird, muss dieser wieder angepasst werden (d.h. 100% schwarz bis 100% weiss).
Am einfachsten macht man das mit „Auto Contrast“. Hier ist allerdings Wichtig, dass man vorher die Toleranzen auf 0,00% Stellt [1] (Levels… → Options… → Shadows-Clip und Highlights-Clip auf 0,00% Stellen).

Und nun bauen wir stufenweise mehr Detail in unsere Map. In meinem Beispiel habe ich 8 Stufen, wobei ich bei den höheren Detailstufen kleinere „Blur-Schritte“ gemacht habe [2] (somit werden die kleinen Details nicht ganz so spitzig). Bei der niedrigsten Detailstufe sollte der Blur so stark sein, dass die gröbsten Details gerade noch sichtbar sind (z.B. bei einer Mauer sollten die einzelnen Steine noch erkennbar sein). Bei jedem neuem Layer wird der Kontrast natürlich angepasst. Die Oberste stufe ist im Grunde das originale Bild, allerdings auch mit Kontrastanpassungen (falls überhaupt nötig).
Diese Layer müssen jetzt ineinander geblendet werden. Hierfür verwende ich als Layereffect „Screen“ [1], dabei muss aber die Opacity angepasst werden. Diese ergibt sich aus der Anzahl von Layer. In meinem Beispiel also 8 Layer. D.h. 100% / 8 Layer ergiebt 12.5 % für jeden Layer [3]. Der unterste wird natürlich nicht mitgezählt. Dieser bleibt auf 100% Opacity und hat „Normal“ als Layereffect.

Nun kann man alle Layer zusammenmergen und hat im Grunde schon die fertige Displacement Map. Diese kann man auch problemlos tweaken. Z.B. kann man die Gradationskurven bearbeiten.

Gerender sieht das dann so aus (3d Studo Max & VRay & VRayDisplacement):

Bzw. mit Diffusemap so:

Und hier noch zwei weitere Beispiele:

Es gibt sicherlich auch andere Möglichkeiten einen solchen Effekt zu erreichen, wichtig ist allerdgins nur das Prinzip das dahinter steckt.
Photoshop hat z.B. einen Filter namens “Surface Blur”, welcher einen sehr ähnlichen Effekt erzeugt, allerdings wird mit diesem Filter die Oberfläche meist sehr unruhig und rau. Bis jetzt sind mir die besten Ergebnisse mit diesem Workflow gelungen, da man relativ viele Kalibrierungsmöglichkeiten hat.

Ich hoffe dieses Tutorial war halbwegs verständlich. Falls aber doch Unklarheiten bestehen sollten, könnt ihr gerne Fragen stellen.
Ansonsten wünsche ich viel Spass beim selber Probieren!

edit:
Auf Wunsch von Joooo hab ich noch ein ganzes Beispiel gemacht. Das könnt ihr hier herunterladen. Im Zip-File enthalten sind:

  • Orgiginale Textur / Diffuse Map (hab ich übrigens von www.cgtextures.com)
  • psd-File mit den einzelnen Layer
  • fertige Displacement-Map (bei der 2. version hab ich einfach nur den Kontrast mittels Curves bearbeitet)
  • 3ds-Max-Szene mit dementsprechenden Material (ACHTUNG: VRay-Materials & VRay-Displacement)

Aussehen sollte das ganze dann ungefähr so: