<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Guave Studios - Agentur für digitale Medien &#187; Tutorial</title>
	<atom:link href="http://www.guavestudios.com/blog/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.guavestudios.com/blog</link>
	<description>Blog für Webdesign Zürich, Onlinemarketing und Multimedia.</description>
	<lastBuildDate>Tue, 07 Feb 2012 08:37:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Tutorial: Voxel via Particle Flow</title>
		<link>http://www.guavestudios.com/blog/2012/01/tutorial-voxel-via-particle-flow/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.guavestudios.com/blog/2012/01/tutorial-voxel-via-particle-flow/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 10:57:46 +0000</pubDate>
		<dc:creator>David Fritsche</dc:creator>
				<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[3ds Max]]></category>
		<category><![CDATA[3ds Max Script]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Voxel]]></category>

		<guid isPermaLink="false">http://www.guavestudios.com/blog/?p=1706</guid>
		<description><![CDATA[Ja, ich gib&#8217;s zu, ich bin ein Minecraft Fan! Da ich mir für diverse Bauprojekte gerne eine Blaupause herstelle, hab ich mir ein Workflow überlegt, wie man ein normales (High-Poly)Mesh in diesen klassischen Block-Voxel-Style umwandeln kann. Im Grunde gibt es dazu zwei verschiedene Herangehensweisen: die einzelnen Voxel mit (A) üblichen Polygon-Boxen herstellen oder (B) mit [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/gs_logo_minecraft.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/gs_logo_minecraft.jpg" alt="ala" width="530" height="400" /></a></p>
<p>Ja, ich gib&#8217;s zu, ich bin ein <a href="http://www.minecraft.net" target="_blank">Minecraft </a> Fan! </p>
<p>Da ich mir für diverse Bauprojekte gerne eine Blaupause herstelle, hab ich mir ein Workflow überlegt, wie man ein normales (High-Poly)Mesh in diesen klassischen Block-Voxel-Style umwandeln kann.</p>
<p>Im Grunde gibt es dazu zwei verschiedene Herangehensweisen: die einzelnen Voxel mit (A) üblichen Polygon-Boxen herstellen oder (B) mit einem Partikel-System.<br />
Beide habe ich ausprobiert und bin zum Entschluss gekommen, dass die Partikel-Variante schneller und vor allem flexiebler ist. Gerade bei einem hohen Voxel-Count ist das Partikel-System von grossem Vorteil.<br />
Verwendet habe ich dabei Particle-Flow und etwas Max-Script.</p>
<p>Meine Lösung funktioniert in etwa so:<br />
1. Fülle ein Bereich/Box mit Voxel/Partikel<br />
2. Entferne alle Voxel/Partikel die nicht innerhalb des Objektes sind<br />
&#8230; klingt einfach und das ist es auch <img src='http://www.guavestudios.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Und das ganze jetzt Schritt für Schritt:</p>
<p><strong>Partikel System erstellen</strong></p>
<p>1. &#8220;PF Source&#8221; in der Szene erstellen</p>
<p>2. Icon Type der PF-Source auf &#8220;Box&#8221; stellen und die Dimensionen so eingeben dass sie das Objekt umschliesst welches wir in den Voxel-Haufen umwandeln möchten (in meinem Beispiel ist das Objekt ein Torus Knopf).<br />
Später werde ich &#8220;Logo Size&#8221; etwas zweckentfremden, dieser Wert steht dann für die Grösse der Voxel-Boxen (bzw. den Abstand des 3D-Rasters)<br />
Nicht Vergessen: Bei &#8220;Quantity Multiplier&#8221; Viewport auf 100% stellen (damit man später auch wirklich alles sieht)</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_01.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_01.jpg" alt="ala" width="530" height="347" /></a></p>
<p><strong>Voxel generieren</strong></p>
<p>3. &#8220;Particle View&#8221; öffnen</p>
<p>4. Da es keinen Operator gibt der ein 3D-Raster mit Partikel füllt muss man sich hier mit etwas MaxScript aushelfen. Darum erstell ich im ersten Event mal ein &#8220;Birth Script&#8221; Operator.</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_02.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_02.jpg" alt="ala" width="530" height="347" /></a></p>
<p>5. Das Script soll ein 3D-Raster erstellen (mit den Dimensionen der Particel-Source) und dieses dann mit Partikel füllen. Dazu könnt ihr folgendes Script einfach kopieren:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">on ChannelsUsed pCont do
(
	pCont.useAge = true
	pCont.useTime = true
	pCont.usePosition = true
)
&nbsp;
on Init pCont do
(
	global ps = pCont.getParticleSystemNode()
	global RasterSize = ps.logo_size
	global RasterSegments = [floor(ps.emitter_width/RasterSize+.5) as integer,floor(ps.emitter_length/RasterSize+.5) as integer,floor(ps.emitter_height/RasterSize+.5) as integer]
	--print RasterSegments
)
&nbsp;
on Proceed pCont do
(
	t = pCont.getTimeStart() as float
	if t &lt; 0 do (
		for x = 0 to (RasterSegments.x-1) do (
		for y = 0 to (RasterSegments.y-1) do (
		for z = 0 to (RasterSegments.z-1) do (
			pCont.AddParticle()
			pCont.particleIndex = pCont.NumParticles()
			pCont.particleAge = 0
			pCont.particlePosition = ps.center + ([x*RasterSize,y*RasterSize,z*RasterSize]-(RasterSegments-[1,1,1])*RasterSize*.5)
		)))
	)
)
&nbsp;
on Release pCont do
(
&nbsp;
)</pre></div></div>

<p><strong>Voxel filtern</strong></p>
<p>6. Mit Hilfe des &#8220;Group Selection&#8221; Operator werden alle Partikel herausgefiltert, die sich (nicht) im Objekt befinden.<br />
Dazu einfach den Operator in das selbe Event schieben und als &#8220;Inside Object&#8221; unseren Torus Knopf auswählen. Zusätzlich &#8220;Reverse Selection&#8221; aktivieren.</p>
<p>7. Mit &#8220;Split Group&#8221; und einem &#8220;Delete&#8221; Operator können wir nun alle überflüssigen Voxels löschen</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_03.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_03.jpg" alt="ala" width="530" height="347" /></a></p>
<p><strong>Voxel Form festlegen</strong></p>
<p>8. Jetzt noch mit dem &#8220;Shape&#8221; Operator die gewünschte Voxelform und -grösse auswählen und fertig ist unser &#8220;Voxel-Generator&#8221;</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_04.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxelgen_04.jpg" alt="ala" width="530" height="347" /></a></p>
<p>.. das ist das Grundkonzept. Wenn man jetzt noch etwas tweaked kann man so ziemlich alles damit machen. Z.B. auch animierte Voxel:</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxel_animation_infinite.gif#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2012/01/voxel_animation_infinite.gif" alt="ala" width="530" height="398" /></a></p>
<p>Wem die Partikel-Technik nicht geheuer ist kann auch gerne dieses Script &#8220;Block Creator&#8221; verwenden:<br />
<a href="http://code.google.com/p/block-creator/downloads/detail?name=block-creator.ms&#038;can=2&#038;q=#makechanges" target="_blank"><big>Download</big></a></p>
<p>Zum Installieren das Script einfach per Drag-and-Drop ins Fenster schieben. Das Tool findet man in der Kategorie &#8220;GSTools&#8221;.</p>
<p>dazu noch ein kurzes Tutorial:<br />
<iframe width="512" height="384" src="http://www.youtube.com/embed/OYnOOkFO-QE" frameborder="0" allowfullscreen></iframe></p>
<div id="facebook_like"><iframe style="height:80px" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.guavestudios.com%2Fblog%2F2012%2F01%2Ftutorial-voxel-via-particle-flow%2F&amp;layout=standard&amp;show-faces=true&amp;width=450&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:auto;"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.guavestudios.com/blog/2012/01/tutorial-voxel-via-particle-flow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fcfg &#8211; Flash Configuration Utility</title>
		<link>http://www.guavestudios.com/blog/2010/11/fcfg-flash-configuration-utility/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.guavestudios.com/blog/2010/11/fcfg-flash-configuration-utility/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 13:17:27 +0000</pubDate>
		<dc:creator>Martin Muther</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[fcfg]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.guavestudios.com/blog/?p=682</guid>
		<description><![CDATA[Ein einfaches Utility um Konfigurationen für Flash zu verwalten.]]></description>
			<content:encoded><![CDATA[<h3><a href="http://www.guavestudios.com/blog/wp-content/uploads/2010/11/fcfg.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-1066  alignnone" title="fcfg" src="http://www.guavestudios.com/blog/wp-content/uploads/2010/11/fcfg.png" alt="fcfg logo" width="187" height="99" /></a></h3>
<h3>Beschreibung</h3>
<p>Beim Entwickeln von Flash Applikationen und Seiten benötigt man oft Konfigurationen die aus mehren Quellen aus zusammengesetzt werden. Als Beispiel könnte man hier die Kombination von FlashVars und einer XML Datei die später geladen wird, anführen. Guave Studios versucht hier immer wieder generalisierte Abläufe zu finden um den individuellen Testaufwand zu reduzieren.</p>
<p>Beide enthalten Konfigurationsparameter und müssen an einem Punkt zusammengefügt werden. Wichtig ist hierbei aber, dass die Konfigurationseinträge in den richtigen Formaten und Reihenfolgen und IDs aufeinander abgestimmt werden.</p>
<p>Fcfg bietet hier eine ganz einfachen Ansatz. Es gibt verschiedene Reader, die je nach Datenquelle die Konfigurations IDs und Werte einlesen. Der zuletzt eingefügte Reader überdeckt sozusagen die unteren Reader und bildet somit einen Stammbaum. Die originalen Werte bleiben dadurch bestehen.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> cfg:Fcfg = Fcfg.<span style="color: #006600;">getUniqueInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
cfg.<span style="color: #006600;">addReader</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#123;</span> config:<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
cfg.<span style="color: #006600;">addReader</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#123;</span> config:<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config: &quot;</span>+cfg.<span style="color: #006600;">g</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Output: config 2</span></pre></div></div>

<h3>Mehrere Quellen</h3>
<p>Konfigurationen von mehreren Quellen. Derzeit integriert sind:</p>
<ul>
<li>Flash Objects (Stage parameters, objects)</li>
<li>XML Dateien</li>
</ul>
<p>Als Beispiel eine Normale Applikation die default Values hat, Parameter über FlashVars übergeben bekommt und nachträglich eine XML Config ladet:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> cfg:Fcfg = Fcfg.<span style="color: #006600;">getUniqueInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//initialize application default values</span>
cfg.<span style="color: #006600;">addReader</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#123;</span>
	config:<span style="color: #ff0000;">&quot;default value&quot;</span>
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//add stage parameters as values FlashVars: config:&quot;flashvar value&quot;</span>
cfg.<span style="color: #006600;">addReader</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">stage</span>.<span style="color: #006600;">loaderInfo</span>.<span style="color: #006600;">parameters</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config: &quot;</span> + cfg.<span style="color: #006600;">g</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//long version: cfg.getSetting</span>
<span style="color: #808080; font-style: italic;">//Output: config: flashvar value</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//....</span>
<span style="color: #808080; font-style: italic;">//Later on an xml get loaded</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">xml</span>:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;&amp;amp;lgt;root&amp;gt;&amp;lt;setting id='config'&amp;gt;xml value&amp;lt;/setting&amp;gt;&amp;lt;root&amp;gt;&quot;</span><span style="color: #66cc66;">&#41;</span>;
cfg.<span style="color: #006600;">addReader</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">xml</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config: &quot;</span> + cfg.<span style="color: #006600;">g</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Output: config: xml value</span></pre></div></div>

<h3>Ändern zur Laufzeit</h3>
<p>Die Konfiguration kann zur Laufzeit verändert werden ohne die originalen Daten zu verändern.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> cfg:Fcfg = Fcfg.<span style="color: #006600;">getUniqueInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//initialize application default values</span>
cfg.<span style="color: #006600;">addReader</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#123;</span>
	config:<span style="color: #ff0000;">&quot;default value&quot;</span>
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
cfg.<span style="color: #006600;">s</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span>, <span style="color: #ff0000;">&quot;overriden value&quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//long version: cfg.setSetting</span>
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config: &quot;</span> + cfg.<span style="color: #006600;">g</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Output: config: overriden value</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//now lets remove the setting</span>
cfg.<span style="color: #006600;">r</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//long version: cfg.removeSetting</span>
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config: &quot;</span> + cfg.<span style="color: #006600;">g</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Output: config: default value</span></pre></div></div>

<h3>Kettenstruktur</h3>
<p>Im den vorigen Beispielen sieht man, dass die Konfiguration eine Strutkur von mehreren Readern/Writern ist.</p>
<p><strong>Aufbau:</strong></p>
<ol>
<li>Default Value Reader (Object Reader/Writer)</li>
<li>Stage Params Reader (Object Reader/Writer)</li>
<li>XML Config Reader (XML Reader)</li>
<li>Default Modifier (Object Reader/Writer)</li>
</ol>
<p><em>cfg.setSetting(&#8220;config&#8221;,&#8221;value&#8221;);</em> hat hier den vierten Punkt editiert. Die Kette wir von Unten (4) nach Oben(1) abgearbeitet. Das Value des ersten Readers, der die Config ID (&#8220;config&#8221;) beinhaltet, wird genommen.</p>
<p>Beim editieren wird der <em>defaultModifier</em> genommen. Dieser ist mit einer gewissen Priorität (20) gespeichert. Bei einem <em>Modifier </em>kann man Werte editieren und löschen.</p>
<p>Der Object Reader/Writer kann dies standardmässig.</p>
<h3>Events</h3>
<p>Bei Änderungen an Konfigurationseinträgen werden Events dispatched. Fcfg selbst ist ein <em>IEventDispatcher</em> und unterstützt damit die gänigen AS3 Events.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> sample4<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> cfg:Fcfg = Fcfg.<span style="color: #006600;">getUniqueInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	cfg.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>FcfgEvent.<span style="color: #006600;">SETTING_CHANGED</span>, cfg_changed<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	cfg.<span style="color: #006600;">setSetting</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;config&quot;</span>, <span style="color: #ff0000;">&quot;modified setting&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> cfg_changed<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:FcfgEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;changed: &quot;</span>, <span style="color: #0066CC;">e</span>.<span style="color: #006600;">id</span>, <span style="color: #0066CC;">e</span>.<span style="color: #006600;">newValue</span>, <span style="color: #0066CC;">e</span>.<span style="color: #006600;">oldValue</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #808080; font-style: italic;">//Output changed: config,modified setting,null</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<h3>Multiton</h3>
<p>Um den Zugriff zu zentralisieren und vereinfachen steht ein Multiton in der Fcfg bereit. Somit ist der Zugriff auch auf statischer Ebene möglich.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> cfg:Fcfg = Fcfg.<span style="color: #006600;">getUniqueInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//unique generated name</span>
cfg.<span style="color: #006600;">configName</span>; <span style="color: #808080; font-style: italic;">//stored name, can be recalled with this</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> namedCfg:Fcfg.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;myConfig&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">var</span> otherContextCfg:Fcfg = Fcfg.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;myConfig&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//otherContextCfg and namedCfg reference to the same object</span></pre></div></div>

<h3>Links</h3>
<ul>
<li>Projektseite: <a href="http://code.google.com/p/fcfg" target="_blank">http://code.google.com/p/fcfg</a></li>
<li>Getting started: <a href="http://code.google.com/p/fcfg/wiki/GettingStarted" target="_blank">http://code.google.com/p/fcfg/wiki/GettingStarted</a></li>
</ul>
<p>Like it?<br />
<script type="text/javascript">// <![CDATA[
	var flattr_url = 'http://www.guavestudios.com/blog/2010/11/fcfg-flash-configuration-utility/';
// ]]&gt;</script><br />
<script src="http://api.flattr.com/button/load.js" type="text/javascript"></script></p>
<div id="facebook_like"><iframe style="height:80px" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.guavestudios.com%2Fblog%2F2010%2F11%2Ffcfg-flash-configuration-utility%2F&amp;layout=standard&amp;show-faces=true&amp;width=450&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:auto;"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.guavestudios.com/blog/2010/11/fcfg-flash-configuration-utility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello Air, hello Android :C&#124;</title>
		<link>http://www.guavestudios.com/blog/2010/06/hello-adobe-air-android-tutorial/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.guavestudios.com/blog/2010/06/hello-adobe-air-android-tutorial/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 07:42:06 +0000</pubDate>
		<dc:creator>Martin Muther</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.guavestudios.com/blog/?p=717</guid>
		<description><![CDATA[AIR für Android ist da. Mit CS5 kann man für Android direkt APK Pakete erstellen. Dieser Artikel erklärt wie man AIR auf Android mit FlashDevelop zum laufen bekommt.]]></description>
			<content:encoded><![CDATA[<p>Adobe AIR für Android ist da. Mit CS5 kann man direkt für Android APK Pakete erstellen. Dieser Artikel erklärt wie man AIR auf Android mit FlashDevelop entwickeln kann.</p>
<h3>Mit Guave Studios einen Blick auf Adobe AIR</h3>
<p>Da wir bei Guave Studios daran intressiert sind, in den verschiedensten Kanälen interaktive Inhalte bereitzustellen, beschäftigen wir uns intensiv mit den Möglichkeiten, die uns mobile Endgeräte bieten. Ein wichtiger Faktor für uns ist eine möglichst plattformunabhänige Lösung, um keinen unnötigen Aufwand zu generieren. Unter Plattformunabhänig verstehen wir nicht &#8220;Eine generelle Lösung für alle&#8221; sondern &#8220;Eine Lösung für den Einzelnen basierend auf der Lösung für alle&#8221;.  Adobe AIR bietet einen gemeinsamen Nenner. Ich denke, dass für viele Applikationen &#8211; vorallem im promotionalen Bereich &#8211; Adobe AIR ausreicht. Sollte dies nicht der Fall sein, kann eine spezielle Lösung in betracht gezogen werden.</p>
<h3>AIR for Android</h3>
<p>AIR gibt es für den Android Emulator und auch die Devices mit Android  2.1 (7) oder 2.2 (8). Derzeit befindet sicht AIR noch in der Entwicklung (Beta). Benötigt wird ebenfalls das <a title="Android SDK" href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK</a>.</p>
<h3>Flash CS5</h3>
<p>Nachdem man die Vorraussetzungen (AIR auf dem Device/Emulator, Android SDK) installiert und konfiguriert hat (weiter unten) kann man relativ schnell mit der Entwicklung loslegen.</p>
<p>Der Workflow gestaltet sich recht einfach. Unter File -&gt; AIR Android Settings kann man die Parameter für die Erstellung anpassen. Hier hat man die Möglichkeit einen Schlüssel zu generieren der danach zum signieren verwendet wird. Beim Veröffentlichen wird die APK generiert und automatisch bei angschlossenem Device oder Emulator direkt auf dem Endgerät gestartet. Somit kann auch sofort getestet werden.</p>
<p><em>Nur: <span style="font-size: 14px;">Wer codet denn in CS5 <img src='http://www.guavestudios.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ?</span></em></p>
<h3>Flash Develop</h3>
<h3>(Tutorial)</h3>
<p>Wir hätten auch die Möglichkeit mit Flash Develop über CS5 zu publishen. Ich zeige hier aber die Lösung ohne CS5 benützen zu müssen.</p>
<p>Mit ein paar Einstellungen und einem Template bekommen wir das auch auf Flash Develop oder anderen IDEs zum laufen. Der ganze Worklfow kann per Kommandozeile nachgebaut werden. Selbst debugging direkt in Flash Develop wird möglich.</p>
<p>Hierfür brauchen wir aber noch folgendes:<a title="Flash Develop" href="http://www.flashdevelop.org" target="_blank"></a></p>
<ul>
<li><a title="Flash Develop" href="http://www.flashdevelop.org" target="_blank">Flash Develop</a></li>
<li><a href="http://www.guavestudios.com/blog/wp-content/uploads/2010/06/airandroidtemplate.fdz#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">AIR Android Template for Flash Develop</a></li>
<li><a title="AIR Android" href="http://labs.adobe.com/technologies/air2/android/" target="_blank">AIR 2.5 SDK</a> (register at the prerelease programm)</li>
<li><a title="Flex SDK" href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK" target="_blank">Flex SDK 3.5 oder 4.0</a></li>
<li><a title="Flashplayer 10.1" href="http://labs.adobe.com/downloads/flashplayer10.html">Flashplayer 10.1 playerglobal.swc</a></li>
<li><a title="Android SDK" href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK</a></li>
</ul>
<p>Dann einfach die Flex SDK entpacken. In denselben Ordner können dann die AIR 2.5 Dateien entpackt werden. Dann noch die playerglobal.swc in den Ordner<em> flex40sdk\frameworks\libs\player\10.1</em> entpacken.</p>
<p>Android SDK entpacken und Setup ausführen. Die aktuellen APIs updaten. Um testen zu können benötigen wir hier jetzt den Emulator. (USB weiter unten).  Hier wird Android 2.1 oder 2.2 erstellt. Auf der Seite <a title="AIR Android" href="http://labs.adobe.com/technologies/air2/android/" target="_blank">AIR 2.5 SDK</a> muss man noch die APK Datein für den Emulator und eventuell für das Device runterladen. Ich würde empfehlen, den <em>AndroidSDK/tools </em>Pfad zu den Umgebungsvariablen hinzuzufügen (Rechtsklick auf Computer-&gt;Erweiterte Systemeinstellungen -&gt; Umgebungsvariablen-&gt; PATH)</p>
<p>Wir können jetzt in der Kommandozeile einen Sever starten mit <em>adb start-server</em>. Wenn wir jetzt den Emulator per <em>emulator -avd [EmulatorName]</em> starten. Mit <em>&#8220;adb devices&#8221;</em> sehen wir ob unser Emulator erkannt wurde. Sonst nochmal per <em>&#8220;adb kill-server&#8221;</em> und <em>&#8220;adb start-server&#8221;</em> probieren.</p>
<p><a href="http://www.guavestudios.com/blog/wp-content/uploads/2010/06/adb-kill-startserver.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-728" title="adb-kill-startserver" src="http://www.guavestudios.com/blog/wp-content/uploads/2010/06/adb-kill-startserver.png" alt="adb-kill-startserver" width="680" height="248" /></a></p>
<p>Wenn wir jetzt das air.apk für den Android Emulator ausgepackt haben, können wir per <em>adb install Runtime_Emulator_Eclair_20100517.apk</em> (Eclair ist Android 2.1)</p>
<p>Flash Develop (ab 3.1.1) normal installieren und mit dem Flex SDK verbinden (über Einstellungen-&gt;AS3 Context-&gt;Path to Flexsdk)</p>
<p>Das Flash Develop Template <a href="http://www.guavestudios.com/blog/wp-content/uploads/2010/06/airandroidtemplate.fdz#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">airandroid.fdz</a> kann jetzt ausgeführt werden. Dies ist standardmässig auf Windows mit  Flash Develop verlinkt und wird dann automatisch installiert. Alternativ  kann man auch die Datei auf .zip umbenennen und in den Flash  Develop/Projects Ordner entpacken.</p>
<p style="text-align: left;">Mit Flash Develop kann jetzt ein Projket vom Typ &#8220;Air Android AS3&#8243; erstellt werden. Der Parameter Name ist Pflicht und sollte wenn möglichst klein und ohne Leerzeichen geschrieben werden. Der Package Path kann ich auch empfehlen auszufüllen, da die erstellte Android ApplikationsID sich dann aus <em>packagepath.projectname</em> zusammensetzt.</p>
<p style="text-align: left;"><a href="http://www.guavestudios.com/blog/wp-content/uploads/2010/06/airandroid_installshot.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-727 aligncenter" title="AIR Android Flash Wizzard" src="http://www.guavestudios.com/blog/wp-content/uploads/2010/06/airandroid_installshot.png" alt="AIR Android Flash Wizzard" width="557" height="484" /></a></p>
<p>Wir können das Projekt jetzt anlegen.</p>
<p>Im <em>src</em> Ordner kann jetzt die Datei Main.as editiert werden. Ein kleines <em>trace(&#8220;Hello World&#8221;);</em> sollte für unseren ersten Test reichen.</p>
<p>Im Projektordner scripts sollte man noch die <em>settings.bat</em> anpassen um individuelle Keys zu generieren. Es kann auch hier direkt ein Key hinterlegt werden. (CERTIFICATE_FILE). Es kann hier auch ein Passwort spezifiziert werden. Dies ist dann aber während der ganzen Zeit in der Datei gespeichert. Ich würde empfehlen während des Entwicklungsprozesses den SelfSigned Key zu verwenden und erst beim Release auf den richtigen Code Signingkey zu verwenden. Derweilt wird das Passwort automatisch beim Debuggen aus der settings.bat gelesen.</p>
<h3>Endlich testen!</h3>
<p>Jetzt können wir das Projekt direkt per F5 oder dem Run Button testen.</p>
<p>Ablauf:</p>
<ol>
<li>.swf File wird gebuildet</li>
<li>key wird gecheckt und evtl generiert</li>
<li>IP Addresse wird ermittelt um den Debugger zu connecten (Erste IPv4 im ipconfig)</li>
<li>Das APK wird gebuildet und mit dem Key gesigned</li>
<li>Die Applikation wird auf dem verbundenen Device deinstalliert (falls installiert)</li>
<li>Die Applikation wird auf dem verbundenen Device installiert</li>
<li>Die Applikation wird auf dem Device gestartet</li>
<li>Der Debugger connected zum Debugger auf der hinterlegten IP</li>
<li>Hello Android müsste in der Console auftauchen</li>
</ol>
<h3>Anmerkungen zum Device USB Debugging</h3>
<p>Das heikelste war es, mein HTC Desire mit Android 2.1 für die Entwicklung zu präparieren. Ich habe viele Informationen im Internet gefunden, jedoch nur wenige waren erfolgreich.</p>
<p>Was ich speziell zum HTC Desire sagen kann ist, den Treiber der auf der SD Card ist zu benutzen. Dieser wird mit HTC Sync installiert. Aktiviert man auf dem Device das USB Debugging, sieht das Device mit <em>&#8220;adb devices&#8221;</em>.</p>
<p>Für das Flash Debugging wird WLAN Access benötigt. Mit einer zugewiesenen IP (DHCP zb) kann man das Device zum Debugger verbinden.</p>
<p>Und voila, viel Spass beim Applikationen schreiben.</p>
<h3>Links</h3>
<ul>
<li><a title="Android SDK" href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK</a></li>
<li><a title="Flash CS5" href="http://www.adobe.com/products/flash/" target="_blank">Flash CS5</a></li>
<li><a title="Flash Develop" href="http://www.flashdevelop.org" target="_blank">Flash Develop</a></li>
<li><a href="http://www.guavestudios.com/blog/wp-content/uploads/2010/06/airandroidtemplate.fdz#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">AIR  Android Template for Flash Develop</a></li>
<li><a title="AIR Android" href="http://labs.adobe.com/technologies/air2/android/" target="_blank">AIR 2.5 SDK</a> (register at the prerelease programm)</li>
<li><a title="Flex SDK" href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK" target="_blank">Flex  SDK 3.5 oder 4.0</a></li>
<li><a title="Flashplayer 10.1" href="http://labs.adobe.com/downloads/flashplayer10.html">Flashplayer  10.1 playerglobal.swc</a></li>
</ul>
<p><script type="text/javascript">// <![CDATA[
	var flattr_url = 'http://www.guavestudios.com/blog/2010/06/hello-adobe-air-android-tutorial/';
// ]]&gt;</script><br />
<script src="http://api.flattr.com/button/load.js" type="text/javascript"></script></p>
<div id="facebook_like"><iframe style="height:80px" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.guavestudios.com%2Fblog%2F2010%2F06%2Fhello-adobe-air-android-tutorial%2F&amp;layout=standard&amp;show-faces=true&amp;width=450&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:auto;"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.guavestudios.com/blog/2010/06/hello-adobe-air-android-tutorial/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Fnfo &#8211; Flash Info</title>
		<link>http://www.guavestudios.com/blog/2010/04/fnfo-flash-info/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.guavestudios.com/blog/2010/04/fnfo-flash-info/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 15:30:57 +0000</pubDate>
		<dc:creator>Martin Muther</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[fnfo]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[webentwicklung]]></category>

		<guid isPermaLink="false">http://www.guavestudios.com/blog/?p=604</guid>
		<description><![CDATA[Fnfo ist ein Utility um Informationen über ein Flash Objekt anzuzeigen. Hinzu kann Fnfo um Plugins erweitert werden, die z.b. Build Informationen anzeigen.]]></description>
			<content:encoded><![CDATA[<p><strong>Flash Version Information</strong></p>
<p>Die Flash Version Information ist ein Development und Deployment Tool für Flash Anwendungen.</p>
<h3>Implementierung</h3>
<p>Die einfache Implementierung erfordert eine Zeile Code.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">Fnfo.<span style="color: #006600;">initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Mit BuildInformation Plugin</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">Fnfo.<span style="color: #006600;">initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, <span style="color: #66cc66;">&#123;</span>versioninfo:FnfoVersion_fnfo.<span style="color: #006600;">VERSION_FILE</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Das Resultat ist dieses untere Flash. (Rechts in das Flash klicken und den Context Menüpunkt fnfo anklicken)</p>
<p>
<object width="800" height="450">
<param name="movie" value="http://www.guavestudios.com/blog/wp-content/uploads/2010/04/fnfo-07.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<param name="flashvars" value="test1Param=Hello&amp;test2Param=World"></param>
<embed type="application/x-shockwave-flash" width="800" height="450" src="http://www.guavestudios.com/blog/wp-content/uploads/2010/04/fnfo-07.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" flashvars="test1Param=Hello&amp;test2Param=World" ></embed>
</object>
</p>
<p>Um die Information zu schliessen einfach nochmal Rechtsklick und fnfo anklicken.</p>
<p>Der Output wäre wie folgt:</p>
<pre>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</pre>
<p>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.</p>
<p>Weitere Beispiele finden sich unter: <a title="GettingStarted" href="http://code.google.com/p/fnfo/wiki/GettingStarted">GettingStarted</a></p>
<h3>Plugins</h3>
<p>Derzeit sind die meisten Plugins integriert. Eine Plugin Struktur ermöglicht es aber eigene Plugins selbst hinzuzufügen.</p>
<p>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.</p>
<h3>Integration in bestehende IDEs</h3>
<p>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.</p>
<p>Prebuild command in Flash Develop:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">scripts<span style="color: #66cc66;">/</span><span style="color: #0066CC;">version</span>.<span style="color: #006600;">bat</span> $<span style="color: #66cc66;">&#40;</span>OutputName<span style="color: #66cc66;">&#41;</span> $<span style="color: #66cc66;">&#40;</span>ProjectName<span style="color: #66cc66;">&#41;</span> src</pre></div></div>

<p>Die Buildnummer setzt sich derzeit aus:</p>
<pre>{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</pre>
<h3>Status</h3>
<p>Derzeit befindet sich das Tool in Entwicklung. Vorallem mit dem Flashplayer 10.1 mit Global Errorhandling werden wir eine komfortable &#8220;Fehler melden&#8221; Möglichkeit einbauen.</p>
<p>Meinen Dank an Guave Studios, dass dieses Projekt ebenfalls Open Source ist.</p>
<h3>Links</h3>
<ul>
<li><a title="Fnfo Project" href="http://code.google.com/p/fnfo">http://code.google.com/p/fnfo</a></li>
<li><a title="GettingStarted" href="http://code.google.com/p/fnfo/wiki/GettingStarted">http://code.google.com/p/fnfo/wiki/GettingStarted</a></li>
</ul>
<div id="facebook_like"><iframe style="height:80px" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.guavestudios.com%2Fblog%2F2010%2F04%2Ffnfo-flash-info%2F&amp;layout=standard&amp;show-faces=true&amp;width=450&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:auto;"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.guavestudios.com/blog/2010/04/fnfo-flash-info/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Timelapse bei ungünstigen Lichtverhältnissen</title>
		<link>http://www.guavestudios.com/blog/2010/01/tutorial-timelapse-tv-spot/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.guavestudios.com/blog/2010/01/tutorial-timelapse-tv-spot/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 15:55:06 +0000</pubDate>
		<dc:creator>David Fritsche</dc:creator>
				<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[canon 5d mark ii]]></category>
		<category><![CDATA[hdr]]></category>
		<category><![CDATA[timelapse]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.guavestudios.com/blog/?p=525</guid>
		<description><![CDATA[Da wir für den Kurzfilm &#8220;The Prague Assignment&#8221; 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Da wir für den Kurzfilm &#8220;The Prague Assignment&#8221; 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.</p>
<p>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).</p>
<p>Das Problem bei einem Sonnenaufgang (oder -untergang) ist folgendes:<br />
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.</p>
<p>Es gibt allerdings eine Technik, mit der sich das flackernde Bildmaterial ausgleichen lässt. Nämlich <span style="color: #ffffff;"><strong>Tone Mapping</strong></span> (bei HDR Bilder).<br />
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 &#8220;Fake HDR&#8221; erzeugen.<br />
Hierbei hilft uns die Software &#8220;Photomatix&#8221;. Mit einem &#8220;Batch Process&#8221; (in Photomatix gibt es die Option &#8220;Batch Single Files&#8221;) 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.<br />
Warum? Ganz einfach, weil (einfach ausgedrückt) Tone Mapping in einem Bild die besten &#8220;Kontrastverhältnisse&#8221; sucht. Wenn ein Foto also etwas heller oder etwas dunkler ist, ist das Optimum meist irgendwo dazwischen.<br />
Hier kann man wieder einen Batch Prozess über die gerade eben erstellten HDR Bilder laufen lassen, aber dieses mal mit Tone Mapping.</p>
<p>Das Ergebnis kann dann so aussehen und beispielsweise in Movies oder TV Spots eingesetzt werden.<br />
(oben: normale JPGs der Kamera; unten: die bearbeiteten Pseudo HDR Bilder)</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="413" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://vimeo.com/moogaloop.swf?clip_id=8839581&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=c9ff23&amp;fullscreen=1" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=8839581&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=c9ff23&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="550" height="413" src="http://vimeo.com/moogaloop.swf?clip_id=8839581&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=c9ff23&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true" data="http://vimeo.com/moogaloop.swf?clip_id=8839581&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=c9ff23&amp;fullscreen=1"></embed></object></p>
<p><a href="http://vimeo.com/8839581">Pseudo HDR Timelapse Comparison</a> from <a href="http://vimeo.com/guavestudios">Guave Studios</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>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.<br />
Ich denke, wenn man mit den Tone Mapping Einstellungen noch etwas spielt, verschwindet auch noch das bisschen Flackern.</p>
<p>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.<br />
Ansonsten wünsche ich viel Spass beim selber Probieren!</p>
<div id="facebook_like"><iframe style="height:80px" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.guavestudios.com%2Fblog%2F2010%2F01%2Ftutorial-timelapse-tv-spot%2F&amp;layout=standard&amp;show-faces=true&amp;width=450&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:auto;"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.guavestudios.com/blog/2010/01/tutorial-timelapse-tv-spot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fCon Flash Deployment Console</title>
		<link>http://www.guavestudios.com/blog/2009/06/fcon-flash-deployment-console/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.guavestudios.com/blog/2009/06/fcon-flash-deployment-console/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 11:49:06 +0000</pubDate>
		<dc:creator>Martin Muther</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[fcon]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[webentwicklung]]></category>

		<guid isPermaLink="false">http://www.guavestudios.com/blog/?p=215</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-296" title="fcon_logo" src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/fcon_logo.png" alt="fcon_logo" width="286" height="159" /></p>
<p>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). <strong></strong></p>
<p><strong>Applikationskontrolle</strong></p>
<p>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.</p>
<p><strong>Modifikation von Variablen</strong></p>
<p>Die fCon bietet Möglichkeiten für das setzen von Variablen. Sie bietet vorallem mit Vervollständigung eine Navigation durch alle DisplayObjects.</p>
<p><strong>Deployment Logging</strong></p>
<p>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.</p>
<p><strong>History</strong></p>
<p>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.</p>
<p><strong>Scripts und Variablen</strong></p>
<p>Zusätzlich ist ein einfaches Scripting und Variablendeffinitionen möglich.<strong> </strong></p>
<p><strong>Sicherheit</strong></p>
<p>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 &#8220;geheim&#8221; das diese Applikation eine Console bietet. Das Passwort ist selbstverständlich gehashed und somit auch nicht auslesbar.</p>
<p><strong>Ein paar kleine Beispiele</strong></p>
<p>Einfaches Setup</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package <span style="color: #66cc66;">&#123;</span>
  <span style="color: #0066CC;">import</span> com.<span style="color: #006600;">guavestudios</span>.<span style="color: #006600;">fcon</span>.<span style="color: #006600;">ConsoleImpl</span>;
  <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
  <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">StageAlign</span>;
  <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">StageScaleMode</span>;
  <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">Event</span>;
  <span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">TextField</span>;
  <span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #006600;">TextFieldAutoSize</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">/**
   * fCon Sample
   * @author maze | guavestudios.com
   */</span>
  <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #0066CC;">extends</span> Sprite <span style="color: #66cc66;">&#123;</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> txt:<span style="color: #0066CC;">TextField</span>;
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">stage</span><span style="color: #66cc66;">&#41;</span> init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #b1b100;">else</span> addEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ADDED_TO_STAGE</span>, init<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> init<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:Event = <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
      removeEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ADDED_TO_STAGE</span>, init<span style="color: #66cc66;">&#41;</span>;
      <span style="color: #808080; font-style: italic;">// entry point</span>
      <span style="color: #0066CC;">stage</span>.<span style="color: #0066CC;">scaleMode</span> = StageScaleMode.<span style="color: #006600;">NO_SCALE</span>;
      <span style="color: #0066CC;">stage</span>.<span style="color: #0066CC;">align</span> = StageAlign.<span style="color: #006600;">TOP_LEFT</span>;
&nbsp;
      ConsoleImpl; <span style="color: #808080; font-style: italic;">//reference the console</span>
      <span style="color: #000000; font-weight: bold;">var</span> config:<span style="color: #0066CC;">XML</span>=
&nbsp;
         <span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>crtl+Char.<span style="color: #66cc66;">&lt;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;&lt;/</span>setting<span style="color: #66cc66;">&gt;</span>
         <span style="color: #66cc66;">&lt;</span>setting id=<span style="color: #ff0000;">&quot;Console.trace&quot;</span><span style="color: #66cc66;">&gt;</span>false<span style="color: #66cc66;">&lt;/</span>setting<span style="color: #66cc66;">&gt;</span>
         <span style="color: #66cc66;">&lt;</span>setting id=<span style="color: #ff0000;">&quot;AutoCompletion.Key&quot;</span><span style="color: #66cc66;">&gt;&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>Char.<span style="color: #66cc66;">&lt;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
         <span style="color: #000000; font-weight: bold;">true</span>
         <span style="color: #000000; font-weight: bold;">true</span>
        ;
      Console.<span style="color: #006600;">setStage</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">stage</span>, config<span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//initialize console</span>
&nbsp;
      Console.<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Hello World&quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//sample trace</span>
&nbsp;
      <span style="color: #808080; font-style: italic;">//create a sample textfield</span>
      txt = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">TextField</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
      txt.<span style="color: #0066CC;">autoSize</span> = TextFieldAutoSize.<span style="color: #0066CC;">LEFT</span>;
      txt.<span style="color: #0066CC;">text</span> = <span style="color: #ff0000;">&quot;Open with 'CRTL + &amp;lt;' and completion with '&amp;lt;'&quot;</span>;
      addChild<span style="color: #66cc66;">&#40;</span>txt<span style="color: #66cc66;">&#41;</span>;
&nbsp;
      <span style="color: #808080; font-style: italic;">//register an sample command with textField</span>
      Console.<span style="color: #006600;">execute</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;loadCommand&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> SampleCommand<span style="color: #66cc66;">&#40;</span>txt<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
     * sample function
     * @return testString
     */</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #ff0000;">&quot;this is a test String&quot;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Um die Console aufzurufen muss man zuerst das Flash aktivieren und CRTL + &lt; drücken. Dieser Shortcut ist frei definierbar mit der Config.</p>
<p>Das kleine Tutorial zeigt einige Funktionen die die Console im jetztigen Status kann. Die ganzen Kommandos können nach der Reihe ausgeführt werden.<br />
Die Console ist gleich darunter eingebettet und ist noch zugeklappt:<br />
<big>Console</big><br />

<object width="510" height="250">
<param name="movie" value="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/blogfcon4.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<embed type="application/x-shockwave-flash" width="510" height="250" src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/blogfcon4.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<ul class="numeric">
<li>Ist die Console offen und das Eingabe Feld aktiviert kann man mit <em>&lt;</em> alle verfügbaren Commandos anzeigen.</li>
<li>mit <strong><em>pr</em></strong> und <strong><em>&lt;</em></strong> vervollständigt die Console zu <strong><em>print</em></strong> Leertaste. Danach <strong><em>Hello World</em></strong> eingeben und Enter drücken</li>
<li><strong><em>align help</em></strong> eingeben um eine hilfe über den Align Command darzustellen</li>
<li><strong><em>align bottom</em></strong> eingeben um die Console ganz untem im Flash zu positionieren</li>
<li>Wir befinden uns derzeit auf der Stage</li>
<li><strong><em>print $stage.@</em></strong> und mit <strong><em>&lt;</em></strong> vervollständigen um die verfügbaren Childs der Stage anzuzeigen (nummeriert)</li>
<li>weiter schreiben mit <strong><em>1.</em></strong> und vervollständigen mit <strong><em>&lt;</em></strong>. Wir befinden uns jetzt in der Applikation und sehen die Eigenschaften.</li>
<li>Die ganze Zeile kann jetzt weitergeschrieben werden auf <strong><em>print $stage.@0.txt.text</em></strong> und mit Enter ausführen</li>
<li>Da wir das Textfeld nocheinmal brauchen können wir es in eine Variable speichern.</li>
<li><strong><em>set textField $stage.@0.txt</em></strong></li>
<li>Wir können jetzt eine Variable modifiziern mit <strong><em>modify $textField.name &#8216;myTextField&#8217;</em></strong></li>
<li>Die Vervollständigung kann auch auf Element Namen reagieren.</li>
<li><strong><em>print $stage.@0.#</em></strong> und mit <strong><em>&lt;</em></strong> vervollständigen. Jetzt wird myTextField als benanntes Item angezeigt. (Listet alle DisplayObjects mit Namen auf)</li>
<li>Fertigschreiben <strong><em>print $stage.@0.#myTextField.text</em></strong></li>
<li>Wir können das Textfeld umpositionieren mit <strong><em>modify $textField.y 50</em></strong></li>
<li>Wir haben bei der Initialisierung die Console um &#8220;SampleCommand&#8221; erweitert. Der Command ist sampleCommand</li>
<li><strong><em>sampleCommand $textField.x $textField.y</em></strong></li>
</ul>
<p>Wir haben die Flash Deployment Console mit unseren Applikationen weiterentwickelt und jetzt online verfügbar gemacht.<br />
Im Trunk befinden sich derzeit noch mehr Plugins und Commands die ich bei Zeit vorstellen werde.</p>
<p><a href="http://fcon.googlecode.com" target="blank">fCon on Googlecode.com</a></p>
<p><a href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/fconblog.zip#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">Sourcecode für Sample</a></p>
<p>Das ganze ist OpenSoure und unter MIT Lizenz. Wer mitentwickeln möchte kann sich gerne bei uns melden.</p>
<div id="facebook_like"><iframe style="height:80px" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.guavestudios.com%2Fblog%2F2009%2F06%2Ffcon-flash-deployment-console%2F&amp;layout=standard&amp;show-faces=true&amp;width=450&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:auto;"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.guavestudios.com/blog/2009/06/fcon-flash-deployment-console/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Displacement Map aus Fototextur generieren</title>
		<link>http://www.guavestudios.com/blog/2009/06/tutorial-displacement-map-aus-fototextur-generieren/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.guavestudios.com/blog/2009/06/tutorial-displacement-map-aus-fototextur-generieren/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 13:53:19 +0000</pubDate>
		<dc:creator>David Fritsche</dc:creator>
				<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[Texturen]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.guavestudios.com/blog/?p=65</guid>
		<description><![CDATA[Tutorial, wie man aus einer Fototextur eine qualitativ hochwertie Displacement Map generiert.]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/workflow.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/workflow.jpg" alt="ala" width="530" height="152" /></a></p>
<p>Es gibt diesbezüglich zwar schon ein Programm namens &#8220;CrazyBump&#8221; (<a href="http://www.crazybump.com" target="_blank">www.crazybump.com</a>), 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.</p>
<p>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.<br />
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.</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/workflow_desat.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/workflow_desat.jpg" alt="" width="520" height="222" /></a></p>
<p>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.</p>
<p>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.</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/blured1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/blured1.jpg" alt="" width="520" height="390" /></a></p>
<p>Vorher empfehle ich übrigens die ganze Komposition auf 16bit-Mode zu stellen, weil Displacement Maps grundsätzlich hohe Bit-tiefen benötigen.<br />
Da mit diesem Effekt (Weichzeichnen) aber der Kontrast verringert wird, muss dieser wieder angepasst werden (d.h. 100% schwarz bis 100% weiss).<br />
Am einfachsten macht man das mit „Auto Contrast“. Hier ist allerdings Wichtig, dass man vorher die Toleranzen auf 0,00% Stellt [1] (Levels&#8230; → Options&#8230; → Shadows-Clip und Highlights-Clip auf 0,00% Stellen).</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/level_settings.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/level_settings.jpg" alt="" width="339" height="315" /></a></p>
<p>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).<br />
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.</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/layer_settings1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/layer_settings1.jpg" alt="" width="237" height="415" /></a></p>
<p>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.</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/final_displacementmap.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/final_displacementmap.jpg" alt="" width="520" height="390" /></a></p>
<p>Gerender sieht das dann so aus (3d Studo Max &amp; VRay &amp; VRayDisplacement):</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/final_wire.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/final_wire.jpg" alt="" width="520" height="390" /></a></p>
<p>Bzw. mit Diffusemap so:</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/final_renderb1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/final_renderb1.jpg" alt="" width="520" height="390" /></a></p>
<p>Und hier noch zwei weitere Beispiele:</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/displ_bsp2.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/displ_bsp2.jpg" alt="" width="520" height="260" /></a></p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/displ_bsp3.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/displ_bsp3.jpg" alt="" width="520" height="260" /></a></p>
<p>Es gibt sicherlich auch andere Möglichkeiten einen solchen Effekt zu erreichen, wichtig ist allerdgins nur das Prinzip das dahinter steckt.<br />
Photoshop hat z.B. einen Filter namens &#8220;Surface Blur&#8221;, 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.</p>
<p>Ich hoffe dieses Tutorial war halbwegs verständlich. Falls aber doch Unklarheiten bestehen sollten, könnt ihr gerne Fragen stellen.<br />
Ansonsten wünsche ich viel Spass beim selber Probieren!</p>
<p><strong>edit:</strong><br />
Auf Wunsch von Joooo hab ich noch ein ganzes Beispiel gemacht. Das könnt ihr <a href="http://projects.guavestudios.com/blog/displacement/quartz.zip">hier</a> herunterladen. Im Zip-File enthalten sind:</p>
<ul>
<li>Orgiginale Textur / Diffuse Map (hab ich übrigens von <a href="http://www.cgtextures.com" target="_blank">www.cgtextures.com</a>)</li>
<li>psd-File mit den einzelnen Layer</li>
<li>fertige Displacement-Map (bei der 2. version hab ich einfach nur den Kontrast mittels Curves bearbeitet)</li>
<li>3ds-Max-Szene mit dementsprechenden Material (ACHTUNG: VRay-Materials &#038; VRay-Displacement)</li>
</ul>
<p>Aussehen sollte das ganze dann ungefähr so:</p>
<p><a rel="lightbox[65]" href="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/quartz_rendering.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="http://www.guavestudios.com/blog/wp-content/uploads/2009/06/quartz_rendering.jpg" alt="" width="520" height="390" /></a></p>
<div id="facebook_like"><iframe style="height:80px" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.guavestudios.com%2Fblog%2F2009%2F06%2Ftutorial-displacement-map-aus-fototextur-generieren%2F&amp;layout=standard&amp;show-faces=true&amp;width=450&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:auto;"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.guavestudios.com/blog/2009/06/tutorial-displacement-map-aus-fototextur-generieren/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

