Les textures dans Alternativa3D 8

alternativa3d-logoAujourd’hui nous allons voir comment ajouter des textures à notre modèle de boîte primitive. Pour les bases concernant l’utilisation du moteur Alternativa3D vous pouvez vous référer au premier tutorial Alternativa3D premier pas …

Pour commencer nous allons créer un dossier « assets » dans notre projet, dans lequel nous allons placer une image qui nous servira de texture.Il est indispensable que la hauteur et la largeur de l’image soit une puissance de deux. Sinon vous aurez une erreur à l’exécution :

Argument Error: Error #3682: La taille de la texture n’est pas une puissance de deux.

Si vous le souhaitez, vous pouvez utiliser une texture telle que celle-ci :

box01

Nous chargeons notre texture :

[Embed(source="assets/alternativa3d-logo.png")] static private const BoxTexture:Class; 

Nous créons un objet pour que le bitmap soit chargé dans les ressources, puis nous l’appliquons sur toutes les faces de notre box avec un objet TextureMaterial :

var bmd_res:BitmapTextureResource = new BitmapTextureResource(new BoxTexture().bitmapData);<br />
box.setMaterialToAllSurfaces( new TextureMaterial( bmd_res ) ); 

voici le code complet de l’exemple :

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.materials.TextureMaterial;<br />
import alternativa.engine3d.primitives.Box;<br />
import alternativa.engine3d.resources.BitmapTextureResource;</p>
<p>import flash.display.Sprite;<br />
import flash.display.Stage3D;<br />
import flash.events.Event;</p>
<p>public class Alternativa3DBase02 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;<br />
private var box:Box;</p>
<p>[Embed(source=&quot;assets/box01.png&quot;)] static private const BoxTexture:Class;</p>
<p>public function Alternativa3DBase02()<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 = -300;<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>//box<br />
box = new Box();<br />
var bmd_res:BitmapTextureResource = new BitmapTextureResource(new BoxTexture().bitmapData);<br />
box.setMaterialToAllSurfaces( new TextureMaterial( bmd_res ) );<br />
rootContainer.addChild(box);</p>
<p>stage3D = stage.stage3Ds[0];<br />
stage3D.addEventListener(Event.CONTEXT3D_CREATE, init);<br />
stage3D.requestContext3D();</p>
<p>}</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 enterFrameHandler(event:Event):void<br />
{<br />
box.rotationZ -= 0.01;<br />
box.rotationY += 0.01;<br />
controller.update();<br />
camera.render(stage3D);<br />
}<br />
}<br />
}

le rendu final :

final-300x246

11 janvier 2013