<?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>Hello World: &#187; Sandy 3D engine</title>
	<atom:link href="http://razorblade.netsons.org/category/actionscript/sandy-3d-engine/feed/" rel="self" type="application/rss+xml" />
	<link>http://razorblade.netsons.org</link>
	<description>Programmazione web e oltre: php5, Zend Framework, jQuery, Actionscript 3.0, Sandy 3D Engine e altro</description>
	<lastBuildDate>Fri, 28 Aug 2009 18:23:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Esportare modelli poligonali con AS3 Geom Class Exporter</title>
		<link>http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/</link>
		<comments>http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 06:57:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[3D]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Sandy 3D engine]]></category>
		<category><![CDATA[3D Studio Max]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Arwing]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[AS3 Geom Class Exporter]]></category>
		<category><![CDATA[Away3D]]></category>
		<category><![CDATA[Papervision]]></category>
		<category><![CDATA[Starfox]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=63</guid>
		<description><![CDATA[<h2>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash</h2>

<p>Come abbiamo <a href="http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/">visto in precedenza</a>, per il linguaggio Actionscript sono stati creati diversi motori per la gestione della grafica poligonale, quello su cui ci siamo soffermati è <a href="http://www.flashsandy.org">Sandy 3D Engine</a>.</p>

<p>Sandy 3D Engine offre la possibilità di utilizzare all'interno delle applicazioni dei modelli poligonali. Basicamente esistono due metodi per ottenere questo risultato:<a href="http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter">[...] Continua</a></p>


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash</h2>
<p>Come abbiamo <a href="http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/">visto in precedenza</a>, per il linguaggio Actionscript sono stati creati diversi motori per la gestione della grafica poligonale, quello su cui ci siamo soffermati è <a href="http://www.flashsandy.org">Sandy 3D Engine</a>.</p>
<p>Sandy 3D Engine offre la possibilità di utilizzare all&#8217;interno delle applicazioni dei modelli poligonali realizzati con applicazioni esterne. Basicamente esistono due metodi per ottenere questo risultato:</p>
<ul class="listato">
<li>utilizzare direttamente il formato dell&#8217;applicazione esterna</li>
<li>esportare il modello poligonale in una classe AS3 che successivamente istanzieremo.</li>
</ul>
<p>In questo tutorial prenderemo in considerazione la seconda di queste possibilità, ovvero useremo un plugin per 3D Studio Max che esporterà il modello poligonale, l&#8217;AS3 Geom Class Exporter, plugin sviluppato da <a href="http://www.dreammania.net">Seraf aka Jerome Birembaut</a>, che potete scaricare da <a href="http://razorblade.netsons.org/files/script3ds.rar">questo link</a>. Da notare che il plugin in questione è compatibile anche con <a href="http://blog.papervision3d.org/">Papervision</a> e <a href="http://away3d.com/">Away3D</a>.</p>
<h2>Installare AS3 Geom Class Exporter</h2>
<p>Per installare lo script estraete il contenuto dell&#8217;archivio, quindi da 3DStudio selezionare la tab Utilities, selezionare il pannello maxscript e cliccare il bottone &#8220;Run Script&#8221;. Selezionate lo script estratto, quindi il pannello &#8220;AS3 geom Exporter&#8221; sarà disponibile.</p>
<p>Le opzioni dello script sono le seguenti</p>
<ul class="listato">
<li>Package : il nome del package della classe esportata, lasciatelo pure vuoto</li>
<li>ClassName : il nome della classe esportata</li>
<li>Engine : il 3D engine che volete usare</li>
<li>Scale : per scalare l&#8217;oggetto 3D</li>
<li>Export Vertex Normal</li>
<li>Swap face normal : per alcuni oggetti può capitare di avere le facce invertite. Se succede utilizzare questa opzione</li>
<li>Rounded Vertex coord</li>
</ul>
<h2>Utilizzare l&#8217;oggetto 3D</h2>
<p>Una volta esportato l&#8217;oggetto potremo finalmente utilizzarlo all&#8217;interno della nostra applicazione istanziandolo. Potete scaricare qui di seguito il risultato di una esportazione di un modello di una navicella spaziale ispirata all&#8217;Arwing ( Starfox ) creata dal sottoscritto:</p>
<p><a href="http://razorblade.netsons.org/files/Arwing.rar">Download Arwing.as</a></p>
<p>A questo punto non ci resta che creare la classe Point of Entry comprensiva del codice che serve per inizializzare il motore 3D, che risulterà così:</p>
<pre name="code" class="php">
  package
  {
    import flash.display.Sprite;
    import flash.events.*;
    import sandy.core.Scene3D;
    import sandy.core.scenegraph.*;  

    public class MainClass extends Sprite
    {
      private var player:Arwing;
      private var scene:Scene3D;
      private var camera:Camera3D;
      private var group:Group;  

      public function MainClass(){
        group = new Group("root");
        camera = new Camera3D( 550, 400 );
        scene = new Scene3D( "myScene", this, camera, group);
        player = new Arwing("player");
        scene.root.addChild(player);
        addEventListener( Event.ENTER_FRAME, enterFrameHandler );
      }

      private function enterFrameHandler( event : Event ):void {
        scene.render();
        player.rotateX -=2;
        player.rotateY -=4;
      }
    }
  }
</pre>
<p>Il risultato ottenuto sarà il seguente:</p>
<p><object width="500" height="380" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param value="high" name="quality"/><param value="http://razorblade.netsons.org/flash/as3export.swf" name="src"/><embed width="500" height="380" quality="high" src="http://razorblade.netsons.org/flash/as3export.swf" type="application/x-shockwave-flash"/></object></p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oggetti MD2 con Sandy 3D Engine e Caurina Tweener</title>
		<link>http://razorblade.netsons.org/2008/11/14/oggetti-md2-con-sandy-3d-engine-e-caurina-tweener/</link>
		<comments>http://razorblade.netsons.org/2008/11/14/oggetti-md2-con-sandy-3d-engine-e-caurina-tweener/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 05:12:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Sandy 3D engine]]></category>
		<category><![CDATA[caurina]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[Id Software]]></category>
		<category><![CDATA[MD2]]></category>
		<category><![CDATA[Philip Martin]]></category>
		<category><![CDATA[Quake]]></category>
		<category><![CDATA[Quake Model Editor]]></category>
		<category><![CDATA[tweener]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=49</guid>
		<description><![CDATA[<h2>Come effettuare l'importazione e comandarli</h2>

<p>I modelli MD2 sono dei particolari files introdotti dalla Id Software nel gioco Quake 2 nel novembre 1997. E' un formato di semplice comprensione contenente dei modelli poligonali e le relative animazioni frame by frame. Per chi volesse saperne di più segnalo <a href="http://tfc.duke.free.fr/coding/md2-specs-en.html">questo link</a> contenente tutte le spiegazioni tecniche.</p>

<p>Come sempre ecco qui il<a href="http://razorblade.netsons.org/2008/11/14/oggetti-md2-con-sandy-3d-engine-e-caurina-tweener/">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Come effettuare l&#8217;importazione e comandarli</h2>
<p>I modelli MD2 sono dei particolari files introdotti dalla Id Software nel gioco Quake 2 nel novembre 1997. E&#8217; un formato di semplice comprensione contenente dei modelli poligonali e le relative animazioni frame by frame. Per chi volesse saperne di più segnalo <a href="http://tfc.duke.free.fr/coding/md2-specs-en.html">questo link</a> contenente tutte le spiegazioni tecniche.</p>
<p>Come sempre ecco qui il risultato finale: </p>
<p><object width="500" height="400" align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="skybox"><param name="allowScriptAccess" value="sameDomain"/><param name="allowFullScreen" value="false"/><param name="movie" value="http://razorblade.netsons.org/flash/tutMD2/MD2.swf"/><param name="quality" value="high"/><param name="bgcolor" value="#ffffff"/><embed width="500" height="400" align="middle" src="http://razorblade.netsons.org/flash/tutMD2/MD2.swf" quality="high" bgcolor="#ffffff" name="skybox" allowscriptaccess="sameDomain" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/><br />
</object></p>
<p>Il nostro modello importato viene visualizzato nel filmato. I comandi attivi si limitano a richiamare le varie animazioni contenute nel file MD2, per semplicità non ho aggiunto la possibilità di muoversi nello spazio 3D. <b>Premete i tasti numerici sulla vostra tastiera per vedere il personaggio compiere varie animazioni</b>.</p>
<p>Questo invece è il codice sorgente</p>
<pre name="code" class="php">

  package {
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.utils.*;
    import flash.ui.*;

    import sandy.util.*;
    import sandy.core.Scene3D;
    import sandy.core.data.*;
    import sandy.core.scenegraph.*;
    import sandy.materials.*;
    import sandy.materials.attributes.*;
    import sandy.primitive.*;
    import sandy.events.*;

    import caurina.transitions.Tweener;

    public class SandyMain extends Sprite {
      private var scene:Scene3D;
      private var camera:Camera3D;
      private var queue:LoaderQueue;
      private var queueSkin:LoaderQueue;
      private var player:MD2;

      public function SandyMain() {
        queue = new LoaderQueue();
        queue.add( "ogre", new URLRequest("md2/ogre.md2"), "BIN" );
        queue.add( "ogreSkin", new URLRequest("md2/Ogrobase.jpg"), "IMG" );
        queue.addEventListener(SandyEvent.QUEUE_COMPLETE, loadMD2Complete );
        queue.start();
      }

      private function loadMD2Complete(event:Event):void {
        stage.frameRate = 24;
        camera = new Camera3D( 600, 600 );
        scene = new Scene3D( "scene", this, camera, new Group() );
        player = new MD2 ( "ogre", queue.data["ogre"], 2 );
        player.appearance = new Appearance (new BitmapMaterial( queue.data["ogreSkin"].bitmapData ));
        player.x = 0;
        player.y = 0;
        player.rotateY = 270;
        scene.root.addChild(player);
        standAction();
        stage.addEventListener( Event.ENTER_FRAME, enterFrameListener );
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener );
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpListener );
      }

      private function keyDownListener( event : KeyboardEvent ):void {
        var char : String = String.fromCharCode(event.charCode);
        if (char == '1') {
          standAction();
        }
        if (char == '2') {
          waveAltAction();
        }
        if (char == '3') {
          attackAction();
        }
        if (char == '4') {
          deathTwoAction();
        }
        if (char == '5') {
          sniffSniffAction();
        }
        if (char == '6') {
          cWalkAction();
        }
        if (char == '7') {
          bumFlopAction();
        }
        if (char == '8') {
          flipAction();
        }
        if (char == '9') {
          saluteAction();
        }
        if (char == '0') {
          jumpAction();
        }
      }

      private function keyUpListener( event : KeyboardEvent ):void {
        var char : String = String.fromCharCode(event.charCode);
        if (event.keyCode == Keyboard.ENTER) {
          player.x = 0;
          player.y = 0;
          player.z = 100;
        }
      }

      private function enterFrameListener( event : Event ) : void {
        scene.render();
      }

      /*
      standAction()
      runAction()
      attackAction()
      painOneAction()
      painTwoAction()
      painThreeAction()
      jumpAction()
      flipAction()
      saluteAction()
      bumFlopAction()
      waveAltAction()
      sniffSniffAction
      cStandAction
      cWalkAction
      crAttachAction
      crPainAction
      crDeathAction
      deathOneAction
      deathTwoAction
      deathThreeAction()
      boomAction()
      */

      private function standAction():void {
        player.frame = 0;
        Tweener.addTween (player, { frame: 39, time: 8, onComplete: standAction });
      }

      private function runAction():void {
        player.frame = 40;
        Tweener.addTween (player, { frame: 45, time: 0.3, onComplete: runAction  });
      }

      private function attackAction():void {
        player.frame = 46;
        Tweener.addTween (player, { frame: 53, time: 1});
      }

      private function painOneAction():void {
        player.frame = 54;
        Tweener.addTween (player, { frame: 57, time: 1});
      }

      private function painTwoAction():void {
        player.frame = 58;
        Tweener.addTween (player, { frame: 61, time: 1});
      }

      private function painThreeAction():void {
        player.frame = 62;
        Tweener.addTween (player, { frame: 65, time: 1});
      }

      private function jumpAction():void {
        player.frame = 66;
        Tweener.addTween (player, { frame: 71, time: 1});
      }

      private function flipAction():void {
        player.frame = 72;
        Tweener.addTween (player, { frame: 83, time: 1});
      }

      private function saluteAction():void {
        player.frame = 84;
        Tweener.addTween (player, { frame: 94, time: 1});
      }

      private function bumFlopAction():void {
        player.frame = 95;
        Tweener.addTween (player, { frame: 111, time: 1});
      }

      private function waveAltAction():void {
        player.frame = 112;
        Tweener.addTween (player, { frame: 122, time: 1});
      }

      private function sniffSniffAction():void {
        player.frame = 123;
        Tweener.addTween (player, { frame: 134, time: 1});
      }

      private function cStandAction():void {
        player.frame = 135;
        Tweener.addTween (player, { frame: 153, time: 1});
      }

      private function cWalkAction():void {
        player.frame = 154;
        Tweener.addTween (player, { frame: 159, time: 1});
      }

      private function crAttachAction():void {
        player.frame = 160;
        Tweener.addTween (player, { frame: 168, time: 1});
      }

      private function crPainAction():void {
        player.frame = 169;
        Tweener.addTween (player, { frame: 172, time: 1});
      }

      private function crDeathAction():void {
        player.frame = 173;
        Tweener.addTween (player, { frame: 177, time: 1});
      }

      private function deathOneAction():void {
        player.frame = 178;
        Tweener.addTween (player, { frame: 183, time: 1});
      }

      private function deathTwoAction():void {
        player.frame = 184;
        Tweener.addTween (player, { frame: 189, time: 1});
      }

      private function deathThreeAction():void {
        player.frame = 190;
        Tweener.addTween (player, { frame: 197, time: 1});
      }

      private function boomAction():void {
        player.frame = 198;
      }

    }
  }
</pre>
<p>E adesso addentriamoci nelle dovute spiegazioni. Come detto nel titolo di questo articolo utilizzeremo nel nostro codice la classe Tweener della libreria caurina. Quindi il primo consiglio è scaricare le librerie necessarie, a questo scopo vi consiglio di utilizzare un <b>client svn</b> ed inserire la seguente url di checkuot: <b>http://tweener.googlecode.com/svn/trunk</b>. Scaricherete nella cartella selezionata le librerie aggiornate. Tra le varie sottodirectories che compongono il contenuto del vostro download sarà presente una directory chiamata &#8216;as3&#8242;, che aggiungerete alle librerie di flash ( Modifica -> Preferenze -> Actionscript -> Impostazioni Actionscript 3.0 ).</p>
<h2>La classe Tweener</h2>
<p>Tweener (caurina.transitions.Tweener) è una classe usata per creare tweenings e altre transizioni via codice ActionScript piuttosto che usando la timeline di flash. Questo comporta una maggiore semplicità nella gestione del codice. L&#8217;utilizzo che ne faremo in questo articolo si limita a questo genere di chiamata</p>
<pre name="code" class="php">
      private function attackAction():void {
        player.frame = 46;
        Tweener.addTween (player, { frame: 53, time: 1});
      }
</pre>
</p>
<p>ovvero diciamo alla classe Tweener di arrivare al frame 53 dell&#8217;oggetto player ( che è il nostro MD2 che contiene, come abbiamo detto, una moltitudine di frames di animazione ). Il frame di partenza lo settiamo giusto 1 istante prima di questa chiamata in modo da ottenere la visualizzazione dell&#8217;animazione desiderata.</p>
<p>Viene naturale porsi una domanda, come faccio a sapere una certa animazione da quale frame parte e a quale frame arriva? La risposta a questa domanda è utilizzando un model editor. Più esattamente io ho utilizzato un programma chiamato Quake Model Editor. Questo programma è inizialmente sviluppato da Philip Martin, purtroppo il sito di riferimento è stato sostituito con altro, quindi lo metto in download da <a href="http://www.razorblade.netsons.org/files/q2mdlr91.rar">questo link</a>.</p>
<p>Questo leggerissimo applicativo assomiglia vagamente a 3DStudio Max e vi da la possibilità di visualizzare i files MD2 e vedere le animazioni frame per frame.</p>
<h2>Importazione del file MD2</h2>
<p>Un oggetto MD2 in Sandy 3D Engine è gestito dall&#8217;omonima class, MD2 appunto. Tralasciando quindi il costruttore che utilizzeremo per caricare tutti i files necessari, arriviamo al metodo loadMD2Complete dove istanziamo un oggetto MD2, passando al costruttore il nome dell&#8217;oggetto, l&#8217;oggetto MD2 caricato e il fattore di scala. Quindi lo aggiungiamo nello stage.</p>
<h2>I controlli</h2>
<p>Potete controllare un oggetto MD2 come un qualsiasi altro componente di Sandy3D, quindi modificando le proprietà x, y, z ecc.. In questo tutorial tuttavia non mi addentrerò più di tanto nei controlli del personaggio nello spazio 3D, in ogni caso nel codice sono comprese tutte le animazioni del contenute nel file MD2, ognuna di esse è un metodo della classe. Il codice attuale mostra 10 delle 21 animazioni presenti ( una per tasto numerico ) per provare a vedere le altre non vi resta che modificare il codice. Se un&#8217;animazione viene visualizzata troppo velocemente o lentamente il consiglio è di modificare il valore per la proprietà &#8216;time&#8217;.</p>
<p>Cliccando su <a href="http://www.razorblade.netsons.org/flash/tutMD2/tutMD2.rar">questo link</a> potete scaricare il codice sorgente comprensivo del file MD2.</p>
<p>Prima di concludere voglio segnalarvi un link interessante per recuperare dei modelli MD2, <a href="http://polycount.com/" title="polycount.com/">polycount.com</a>.</p>
<p>Si conclude qui il tutorial, comment, rate and share!</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/11/14/oggetti-md2-con-sandy-3d-engine-e-caurina-tweener/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skybox con Sandy 3D Engine e Actionscript 3.0</title>
		<link>http://razorblade.netsons.org/2008/09/22/skybox-con-sandy-3d-engine-e-actionscript-30/</link>
		<comments>http://razorblade.netsons.org/2008/09/22/skybox-con-sandy-3d-engine-e-actionscript-30/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 18:50:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Sandy 3D engine]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[LoaderQueue]]></category>
		<category><![CDATA[skybox]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=36</guid>
		<description><![CDATA[<h2>Skybox</h2>
<p>Uno skybox è una sorta i contenitore formato da 6 piani che ha la funzione di far da fondale per una applicazione 3D. Il framework Sandy 3D Engine ha un omonimo oggetto che gestisce in maniera molto semplice tutto ciò e, in questo tutorial, vedremo come utilizzarlo e come eventualmente effettuare uno switch delle texture per ognuna delle sue faccie. Inoltre, utilizzeremo un diverso sistema rispetto a quello usato in <a href='http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/' title='flash sandy 3d engine con actionscript 3.0'>questo tutorial</a> per caricare i file esterni all'interno del nostro programma, l'oggetto LoaderQueue.</p>

<p>Per la creazione delle texture possiamo <a href="http://razorblade.netsons.org/2008/09/22/skybox-con-sandy-3d-engine-e-actionscript-30/">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Skybox</h2>
<p>Uno skybox è una sorta i contenitore formato da 6 piani che ha la funzione di far da fondale per una applicazione 3D. Il framework Sandy 3D Engine ha un omonimo oggetto che gestisce in maniera molto semplice tutto ciò e, in questo tutorial, vedremo come utilizzarlo e come eventualmente effettuare uno switch delle texture per ognuna delle sue faccie. Inoltre, utilizzeremo un diverso sistema rispetto a quello usato in <a href='http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/' title='flash sandy 3d engine con actionscript 3.0'>questo tutorial</a> per caricare i file esterni all&#8217;interno del nostro programma, l&#8217;oggetto LoaderQueue.</p>
<p>Per la creazione delle texture possiamo utilizzare il software <a href='http://www.planetside.co.uk/terragen/download.shtml' title='Terragen'>Terragen</a> o cercare sul solito motore di ricerca.</p>
<p><b>SandyMain.as</b></p>
<pre name='code' class='php'>
  package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.ui.*;
    import flash.display.Bitmap;
    import flash.net.URLRequest;

    import sandy.core.Scene3D;
    import sandy.core.scenegraph.*;
    import sandy.primitive.*;
    import sandy.materials.*;
    import sandy.materials.attributes.*;
    import sandy.events.*;
    import sandy.util.*;

    public class SandyMain extends Sprite {
      private static const TOP = 'top';
      private static const LEFT = 'left';
      private static const BOTTOM = 'bottom';
      private static const RIGHT = 'right';
      private static const BACK = 'back';
      private static const FRONT = 'front';

      private var scene:Scene3D;
      private var camera:Camera3D;
      private var group:Group;
      private var queue:LoaderQueue;
      private var skyBox:SkyBox;    

      public function SandyMain():void {
        group = new Group("root");
        camera = new Camera3D( 1024, 768);
        camera.setPosition(0,0,0);
        scene = new Scene3D( "myScene", this, camera, group);
        skyBox  = new SkyBox( "container", 1000, 9, 9 );
        loadSkyTextures();
        group.addChild( skyBox );
      }

      private function loadSkyTextures(type:String = 'default'):void {
        queue = new LoaderQueue();
        queue.add( TOP, new URLRequest("assets/skybox/"+type+"/top.jpg") );
        queue.add( LEFT, new URLRequest("assets/skybox/"+type+"/left.jpg") );
        queue.add( BOTTOM, new URLRequest("assets/skybox/"+type+"/bottom.jpg") );
        queue.add( RIGHT, new URLRequest("assets/skybox/"+type+"/right.jpg") );
        queue.add( BACK, new URLRequest("assets/skybox/"+type+"/back.jpg") );
        queue.add( FRONT, new URLRequest("assets/skybox/"+type+"/front.jpg") );
        queue.addEventListener(SandyEvent.QUEUE_COMPLETE, loadComplete );
        queue.start();
      }

      private function setAppearance():void {
        var mTop = new BitmapMaterial( queue.data[TOP].bitmapData, null );
        var mLeft = new BitmapMaterial( queue.data[LEFT].bitmapData );
        var mBottom = new BitmapMaterial( queue.data[BOTTOM].bitmapData );
        var mRight = new BitmapMaterial( queue.data[RIGHT].bitmapData );
        var mBack = new BitmapMaterial( queue.data[BACK].bitmapData );
        var mFront = new BitmapMaterial( queue.data[FRONT].bitmapData );
        skyBox.top.appearance = new Appearance( mTop );
        skyBox.left.appearance = new Appearance( mLeft );
        skyBox.bottom.appearance = new Appearance( mBottom );
        skyBox.right.appearance = new Appearance( mRight );
        skyBox.back.appearance = new Appearance( mBack );
        skyBox.front.appearance = new Appearance( mFront );
      }

      private function loadComplete( event : QueueEvent ):void {
        setAppearance();
        addEventListener( Event.ENTER_FRAME, enterFrameHandler );
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
      } 

      private function enterFrameHandler( event : Event ):void {
        scene.render();
      } 

      private function keyPressed(event:KeyboardEvent):void {
        switch(event.keyCode) {
          case Keyboard.UP:
            camera.tilt +=2;
            //camera.rotateX -=2;
            break;
          case Keyboard.DOWN:
            camera.tilt -=2;
            //camera.rotateX +=2;
            break;
          case Keyboard.RIGHT:
            //camera.pan +=2;
            camera.rotateY -=2;
            break;
          case Keyboard.LEFT:
            //camera.pan -=2;
            camera.rotateY +=2;
            break;
          case Keyboard.CONTROL:
            camera.roll +=2;
          break;
          case 48:
            loadSkyTextures();
          break;
          case 49:
            loadSkyTextures('skybox');
          break;
        }
      }
    }
  }
</pre>
<p>Nel costruttore creaimo tutto ciò di cui necessita Sandy 3D engine con in aggiunta l&#8217;oggetto skybox. Attribuiremo una diversa texture per ogni faccia tramite la chiamata del metodo loadSkyTextures(), al quale sarà possibile passare un argomento: il nome della subdirectory dove andare a cercare i files da caricare. Da notare il codice che compone questo metodo, dove facciamo uso dell&#8217;oggetto LoaderQueue.</p>
<p>LoaderQueue si occupa di caricare i file specificati tramite il metodo add(), è una volta terminato esegue il dispatch dell&#8217;evento SandyEvent.QUEUE_COMPLETE che richiama il metodo setAppearance() che si occupa di rivestire ogni singola faccia con la relativa immagine.</p>
<p>Con questa impostazione eseguire una switch delle texture di ogni faccia è molto semplice. Alla pressione di un tasto ( in questo caso sono stati utilizzati i tasti numerici 0 e 1 ) effettuiamo una chiamata al metodo loadSkyTextures(); in cui passeremo un argomento diverso dipendentemente da quale rivestimento vogliamo far visualizzare alla pressione di quel tasto.</p>
<p>Qui di seguito il risultato finale:</p>
<p>	<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="500" height="400" id="skybox" align="middle"><param name="allowScriptAccess" value="sameDomain" /><param name="allowFullScreen" value="false" /><param name="movie" value="http://razorblade.netsons.org/flash/tutorial002/skybox.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><embed src="http://razorblade.netsons.org/flash/tutorial002/skybox.swf" quality="high" bgcolor="#ffffff" width="500" height="400" name="skybox" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /><br />
	</object></p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/09/22/skybox-con-sandy-3d-engine-e-actionscript-30/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash Sandy 3D Engine con Actionscript 3.0</title>
		<link>http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/</link>
		<comments>http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 22:29:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Sandy 3D engine]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[3D Framework]]></category>
		<category><![CDATA[3DStudio]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[concatenamento file libreria]]></category>
		<category><![CDATA[ENTER_FRAME]]></category>
		<category><![CDATA[event object]]></category>
		<category><![CDATA[KeyboardEvent Object]]></category>
		<category><![CDATA[keycode]]></category>
		<category><![CDATA[KEY_DOWN]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=8</guid>
		<description><![CDATA[<p>Da qualche mesetto ho avuto il modo di utilizzare questa fantastica libreria per la gestione della grafica poligonale con Actionscript 3.0. Questa vi permette di creare in maniera non troppo complessa, oggetti tridimensionali e farli muovere ed interagire in un mondo tridimensionale.</p>

<p>L'esempio che tratterò in questo articolo sarà quanto di più semplice è possibile realizzare utilizzando questo framework, una sfera texture-mappata rappresentante il pianeta Terra, con in più qualche comando tipo la rotazione negli assi X,Y,Z ed alcuni movimenti della telecamera virtuale.
Se siete pronti non vi resta che scaricare Sandy 3D Engine <a href="http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/">[...] Continua</a></p>



Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Da qualche mesetto ho avuto il modo di utilizzare questa fantastica libreria per la gestione della grafica poligonale con Actionscript 3.0. Questa vi permette di creare in maniera non troppo complessa, oggetti tridimensionali e farli muovere ed interagire in un mondo tridimensionale.</p>
<p>L&#8217;esempio che tratterò in questo articolo sarà quanto di più semplice è possibile realizzare utilizzando questo framework, una sfera texture-mappata rappresentante il pianeta Terra, con in più qualche comando tipo la rotazione negli assi X,Y,Z ed alcuni movimenti della telecamera virtuale.<br />
Se siete pronti non vi resta che scaricare Sandy 3D Engine.</p>
<p>Lo potete trovare in download su <a title="Flash Sandy 3D Engine" href="http://www.flashsandy.org/download" target="_blank">http://www.flashsandy.org/download</a>.</p>
<p>Per i più impazienti, qui sotto potete vedere il risultato finale. Niente male per poche righe di codice, che ne dite?</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="380" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="quality" value="high" /><param name="src" value="http://razorblade.netsons.org/flash/provaSfera.swf" /><embed type="application/x-shockwave-flash" width="500" height="380" src="http://razorblade.netsons.org/flash/provaSfera.swf" quality="high"></embed></object></p>
<p>Usate i tasti 1,2,3,4,5,6 per muovere rispettivamente la Terra nel suo asse X ( 1 e 2 ), Y ( 3 e 4 ) e Z ( 5 e 6 ), inoltre i tasti PAG UP e PAG DOWN per avvicinare ed allontanare la camera virtuale e i tasti direzionali per muovere sempre la camera direzionale nelle relative direzioni.</p>
<p>Prima di cominciare bisogna &#8216;dire&#8217; a Flash dove andare a prendere le librerie di Sandy 3D engine in modo tale che quando le richiameremo nell&#8217;applicazione non ci venga restituito un bell&#8217;errore. Quindi, <strong>dopo aver scaricato Sandy 3D engine</strong>, apriamo flash, nel menu in alto selezioniamo Modifica -&gt; Preferenze ( CTRL+U ), dopodichè selezioniamo Actionscript, clicchiamo su Impostazioni Actionscript 3.0  e selezioniamo la directory in cui abbiamo i file di flash Sandy 3D Engine. Attenzione in questo passaggio, in quanto la directory da selezionare dev&#8217;essere quella che <strong>contiene al suo interno</strong> la directory Sandy ( es. il_mio_percorso/src/ dove src conterrà Sandy ).</p>
<p>Ogni applicazione che utilizza Sandy 3D engine è composta principalmente da questi oggetti:</p>
<ul class="listato">
<li>Una scena 3D, ovvero il mondo 3D</li>
<li>Un gruppo, ovvero un oggetto che conterrà tutti gli altri oggetti</li>
<li>Una camera 3D</li>
</ul>
<p>Il seguente è il codice completo di questa applicazione, ovvero della sfera texture-mappata, del loop dell&#8217;applicazione e dell&#8217;interazione dei comandi della tastiera:</p>
<pre name="code" class="php">
package {
    import flash.display.Sprite;
    import flash.events.*;
    import sandy.core.Scene3D;
    import sandy.core.scenegraph.*;
    import sandy.primitive.*;
    import sandy.materials.*;
    import flash.ui.*;

    public class Sfera extends Sprite {
      private var sfera:Sphere;
      private var scene:Scene3D;
      private var camera:Camera3D;
      private var group:Group;

      public function Sfera():void {
        group = new Group("root");
        camera = new Camera3D( 550, 400 );
        scene = new Scene3D( "myScene", this, camera, group);
        sfera = new Sphere( "mySphere",100,24,18 );
        sfera.appearance = new Appearance(  new BitmapMaterial( new Texture(0,0) ) );
        scene.root.addChild(sfera);
        addEventListener( Event.ENTER_FRAME, enterFrameHandler );
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
      }

      private function enterFrameHandler( event : Event ):void {
        scene.render();
      } 

      private function keyPressed(event:KeyboardEvent):void {
        switch(event.keyCode) {
          case Keyboard.UP:
            camera.tilt +=2;
            break;
          case Keyboard.DOWN:
            camera.tilt -=2;
            break;
          case Keyboard.RIGHT:

            camera.pan -=2;
            break;
          case Keyboard.LEFT:
            camera.pan +=2;
            break;
          case Keyboard.CONTROL:
            camera.roll +=2;
            break;
          case Keyboard.PAGE_DOWN:
            camera.z -=5;
            break;
          case Keyboard.PAGE_UP:
            camera.z +=5;
          break;
          case 49:
            sfera.rotateX+=1;
          break;
          case 50:
            sfera.rotateX-=1;
          break;
          case 51:
            sfera.rotateY+=1;
          break;
          case 52:
            sfera.rotateY-=1;
          break;
          case 53:
            sfera.rotateZ+=1;
          break;
          case 54:
            sfera.rotateZ-=1;
          break;
        }
        trace(event.keyCode);
      }
    }
  }
</pre>
<p>Dalla riga 2 alla riga 8 importiamo tutte le librerie di cui abbiamo bisogno.</p>
<p>Dalla riga 11 alla 14 creaiamo le proprietà private che conterranno gli oggetti fondamentali con in aggiunta la sfera.</p>
<p>La funzione <strong>enterFrameHandler</strong> è quella che viene richiamata in ogni singolo frame, e non a caso renderizza la scena.</p>
<p>La funzione <strong>keyPressed</strong> viene richiamata ogni qual volta un tasto della tastiera è premuto. Se il <strong>keycode</strong> della tastiera corrisponde ad uno dei casi, l&#8217;azione relativa viene eseguita.</p>
<p>All&#8217;interno della funzione <strong>keyPressed</strong> ho aggiunto trace(event.keyCode); che ci permette di visualizzare il keycode del tasto premuto ( un numero intero ).</p>
<p>L&#8217;unico punto su cui dobbiamo soffermarci riguarda l&#8217;inserimento della texture all&#8217;interno dell&#8217;applicazione. Questa, una volta scelta ( <a title="nasa planets textures" href="http://maps.jpl.nasa.gov/pix/" target="_blank">qui</a> ne trovate a volontà ), deve essere importata nella libreria ( File -&gt; apri &#8230; vi ricordo CTRL+L per visulizzare la libreria ) e <strong>concatenata</strong> ad una classe.</p>
<p>Per eseguire questa operazione, selezioniamo il file dalla libreria, destro del mouse e selezioniamo la voce <strong>concatenamento</strong>. Fatto cio attribuiamo un nome classe alla texture, nel nostro caso il nome sarà proprio Texture ( la maiuscola è FONDAMENTALE ). Se visualizzate il codice alla riga 21, è proprio una istanza di Texture ( quindi di questa immagine ) che passiamo come argomento all&#8217;istanza di BitmapMaterial. Inoltre devono essere spuntati &#8216;Esporta per Actionscript&#8217; ed &#8216;Esporta nel primo fotogramma&#8217;.</p>
<p>Per compilare questa applicazione vi ricordo che dovete creare un nuovo documento flash ( linguaggio AS3 ), creare un file chiamato col medesimo nome della classe, <strong>Sfera</strong> nel nostro caso, con estensione .as e legarlo al documento inserendo il nome della classe, <strong>Sfera</strong> all&#8217;interno del campo input di testo in proprietà -&gt; classe documento.</p>
<p>Termina qui questo tutorial di base per il framework Flash Sandy 3D engine. I feedback sono sempre ben accetti quindi se avete domande e/o commenti potete scrivere qui sotto.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
