• Accueil
  • Blog
  • Importation d’objets .A3D dans Alternativa3D

Importation d’objets .A3D dans Alternativa3D

alternativa3d-logo Alternativa3D nous propose sur son site internet le téléchargement d’un plugin pour exporter ses scènes 3DSmax au format .A3D, nous allons voir comment intégrer ces objets 3D dans notre scène flash.

Pour commencer assurez-vous d’avoir téléchargé puis installé le plugin en question! Vous le trouverez en téléchargement gratuit à l’adresse suivante : Alternativa3D

Ouvrez 3ds max, puis créez votre objet 3d, pour l’exemple je vais utiliser l’emblématique « Tea Pot » de 3dsMax.
Appliquez lui une texture « standard » avec un Bitmap comme « Diffuse » :

3dsmax01_A3D-1024x613

Exportez le projet au format A3D :

3dsmax02_A3D-300x202

Passons maintenant au projet as3, créez votre projet comme expliqué dans les précédents tutoriels de la même catégorie.
Nous allons ajouter une fonction « initObject » dans laquelle nous allons charger notre objet .A3D que vous aurez bien sûr, déjà placé dans le dossier /assets/A3D/ de votre projet.
Et faites de même avec la texture que vous placez dans le dossier /assets/textures/ nomdevotretexture.jpg.
Nous utilisons un simple objet URLLoader pour charger notre modele .A3D
Le chargement effectué nous allons parser la scene 3D (ParserA3D), puis récupérer notre Teapot en passant par une boucle sur les objets de la scène.

// Model parsing<br />
var parser:ParserA3D = new ParserA3D();<br />
parser.parse((e.target as URLLoader).data);<br />
var mesh:Mesh;<br />
for each (var object:Object3D in parser.objects)<br />
{<br />
if (object.name == &quot;Teapot01&quot;)<br />
{<br />
mesh = object as Mesh;<br />
break;<br />
}<br />
}</p>
<p>rootContainer.addChild(mesh);        

Une fonction qui permet de charger les textures dans le context3D de la stage3D :

private function uploadResources(resources:Vector.):void<br />
{<br />
for each (var resource:Resource in resources)<br />
{<br />
resource.upload(stage3D.context3D);<br />
}<br />
}

Une boucle sur les matériaux de notre objet 3D, et un chargement de ces mêmes textures.

             var textures:Vector. = new Vector.();<br />
for (var i:int = 0; i &lt; mesh.numSurfaces; i++)<br />
{<br />
var surface:Surface = mesh.getSurface(i);<br />
var material:ParserMaterial = surface.material as ParserMaterial;<br />
if (material != null)<br />
{<br />
var diffuse:ExternalTextureResource = material.textures[&quot;diffuse&quot;];<br />
if (diffuse != null)<br />
{<br />
diffuse.url = &quot;assets/textures/&quot; + diffuse.url;<br />
textures.push(diffuse);<br />
surface.material = new TextureMaterial(diffuse);<br />
}<br />
}<br />
}</p>
<p>// chargement des textures<br />
var texturesLoader:TexturesLoader = new TexturesLoader(stage3D.context3D);<br />
texturesLoader.loadResources(textures);

Il ne vous reste plus qu’à tester votre projet 🙂 !
voici le code complet du projet :

 package<br />
{<br />
import alternativa.engine3d.controllers.SimpleObjectController;<br />
import alternativa.engine3d.core.Camera3D;<br />
import alternativa.engine3d.core.Object3D;<br />
import alternativa.engine3d.core.Resource;<br />
import alternativa.engine3d.core.View;<br />
import alternativa.engine3d.loaders.ParserA3D;<br />
import alternativa.engine3d.loaders.ParserMaterial;<br />
import alternativa.engine3d.loaders.TexturesLoader;<br />
import alternativa.engine3d.materials.TextureMaterial;<br />
import alternativa.engine3d.objects.Mesh;<br />
import alternativa.engine3d.objects.Surface;<br />
import alternativa.engine3d.primitives.Box;<br />
import alternativa.engine3d.resources.BitmapTextureResource;<br />
import alternativa.engine3d.resources.ExternalTextureResource;</p>
<p>import flash.display.Sprite;<br />
import flash.display.Stage3D;<br />
import flash.events.Event;<br />
import flash.net.URLLoader;<br />
import flash.net.URLLoaderDataFormat;<br />
import flash.net.URLRequest;</p>
<p>public class Alternativa3DBase03 extends Sprite<br />
{<br />
private var rootContainer:Object3D = new Object3D();<br />
private var camera:Camera3D;<br />
private var controller:SimpleObjectController;<br />
private var stage3D:Stage3D;</p>
<p>public function Alternativa3DBase03()<br />
{<br />
super();<br />
addEventListener(Event.ADDED_TO_STAGE, init3D);<br />
}</p>
<p>private function init3D(evt:Event):void<br />
{<br />
camera = new Camera3D(0.01, 10000000000);<br />
camera.x = -50;<br />
camera.y = -100;<br />
camera.z = 100;<br />
controller = new SimpleObjectController(stage, camera, 200);<br />
controller.lookAtXYZ(0,0,0);<br />
camera.view = new View(800, 600, false, 0xFFFFFF, 0, 4);<br />
camera.view.hideLogo();<br />
addChild(camera.view);<br />
addChild(camera.diagram);</p>
<p>rootContainer = new Object3D();<br />
rootContainer.addChild(camera);</p>
<p>stage3D = stage.stage3Ds[0];<br />
stage3D.addEventListener(Event.CONTEXT3D_CREATE, init);<br />
stage3D.requestContext3D();</p>
<p>initObject();<br />
}</p>
<p>private function init(event:Event):void<br />
{<br />
for each (var resource:Resource in rootContainer.getResources(true)) {<br />
resource.upload(stage3D.context3D);<br />
}<br />
addEventListener(Event.ENTER_FRAME, enterFrameHandler)<br />
}</p>
<p>private function initObject():void<br />
{<br />
var loaderA3D:URLLoader = new URLLoader();<br />
loaderA3D.dataFormat = URLLoaderDataFormat.BINARY;<br />
loaderA3D.load(new URLRequest(&quot;assets/A3D/TeaPot.A3D&quot;));<br />
loaderA3D.addEventListener(Event.COMPLETE, onA3DLoad);<br />
}</p>
<p>private function onA3DLoad(e:Event):void<br />
{</p>
<p>// on parse le modele<br />
var parser:ParserA3D = new ParserA3D();<br />
parser.parse((e.target as URLLoader).data);<br />
var mesh:Mesh;<br />
for each (var object:Object3D in parser.objects)<br />
{<br />
if (object.name == &quot;Teapot01&quot;)<br />
{<br />
mesh = object as Mesh;<br />
break;<br />
}<br />
}</p>
<p>rootContainer.addChild(mesh);<br />
uploadResources(mesh.getResources());</p>
<p>var textures:Vector. = new Vector.();<br />
for (var i:int = 0; i &lt; mesh.numSurfaces; i++)<br />
{<br />
var surface:Surface = mesh.getSurface(i);<br />
var material:ParserMaterial = surface.material as ParserMaterial;<br />
if (material != null)<br />
{<br />
var diffuse:ExternalTextureResource = material.textures[&quot;diffuse&quot;];<br />
if (diffuse != null)<br />
{<br />
diffuse.url = &quot;assets/textures/&quot; + diffuse.url;<br />
textures.push(diffuse);<br />
surface.material = new TextureMaterial(diffuse);<br />
}<br />
}<br />
}</p>
<p>// chargement des textures<br />
var texturesLoader:TexturesLoader = new TexturesLoader(stage3D.context3D);<br />
texturesLoader.loadResources(textures);<br />
}</p>
<p>private function uploadResources(resources:Vector.):void<br />
{<br />
for each (var resource:Resource in resources)<br />
{<br />
resource.upload(stage3D.context3D);<br />
}<br />
}</p>
<p>private function enterFrameHandler(event:Event):void<br />
{<br />
controller.update();<br />
camera.render(stage3D);<br />
}<br />
}<br />
}

et le rendu qui paye pas de mine je vous l’accorde mais qui aujourd’hui vous permet de charger n’importe quel modèle 3D dans votre scène !

teaPot01

11 janvier 2013