export .obj from alternativa3d

Posted by davidejones

As usual I’ve been playing with Alternativa3D and in my most recent project I wanted to be able to export an .obj 3d file of the 3d environment I had built. There is a ExporterA3D class which I’ve made use of a few times but in this case the export is for users so I wanted something more recognisable so I opted to create a quick object exporter.

The environment I created was using the alternativa primitives and the export I wanted was purely the mesh. So this is what I created.

package exporters 
{
	import flash.utils.ByteArray;
	import flash.display.Sprite;
	import flash.net.FileReference; 
	import alternativa.engine3d.objects.Mesh;
	import alternativa.engine3d.resources.Geometry;
	import alternativa.engine3d.core.Object3D;
	import alternativa.engine3d.core.VertexAttributes;
	import alternativa.engine3d.alternativa3d;
	use namespace alternativa3d;
	
	/**
	 * ...
	 * @author David E Jones
	 */
	public class ExportOBJ extends Sprite 
	{
		public var data:ByteArray;	
		private var objstring:String = "";
		
		public function ExportOBJ(root:Object3D) 
		{
			data = new ByteArray();
			
			exportMeshes(root);

			data.writeUTFBytes(objstring);
			
			var fileRef:FileReference = new FileReference();  
            fileRef.save(data,"export.obj");
		}
		
		private function exportMeshes(source:Object3D):void 
		{
			if (source is Mesh) {
				exportMesh(source as Mesh);
			} else {
				trace("Unsupported object type", source);
			}

			for (var child:Object3D = source.childrenList; child != null; child = child.next) {
				exportMeshes(child);
			}
		}
		
		private function exportMesh(source:Mesh):void 
		{
			var g:Geometry = source.geometry;
			var vertices:Vector. = g.getAttributeValues(VertexAttributes.POSITION);
			var uvts:Vector. = g.getAttributeValues(VertexAttributes.TEXCOORDS[0]);
			var normals:Vector. = g.getAttributeValues(VertexAttributes.NORMAL);
			var tangent:Vector. = g.getAttributeValues(VertexAttributes.TANGENT4);
			var ind:Vector. = g.indices;
			
			var faces:Array = new Array();
			
			//write verts
			for (var i:int = 0; i < vertices.length; i = i + 3)
			{
				faces.push([i+1,i+2,i+3]);
				objstring = objstring + "v " + vertices[i] + " " + vertices[i + 1] + " " + vertices[i + 2] + "\n";
			}
			
			objstring = objstring + "\n";
			
			//write uvs
			for (var j:int = 0; j < uvts.length; j = j + 2)
			{
				objstring = objstring + "vt " + uvts[j] + " " + uvts[j+1] + "\n";
			}
			
			objstring = objstring + "\n";
			
			//write normals
			for (var k:int = 0; k < normals.length; k = k + 3)
			{
				objstring = objstring + "vn " + normals[k] + " " + normals[k + 1] + " " + normals[k + 2] + "\n";
			}
			
			objstring = objstring + "\n";
			
			//write faces
			for (var l:int = 0; l < faces.length; l++)
			{
				objstring = objstring + "f " + faces[l][0] + " " + faces[l][1] + " " + faces[l][2] + "\n";
			}
			
			objstring = objstring + "\n";
		}
		
	}

}

and the usage as follows

import exports.*;

var exp:ExportOBJ = new ExportOBJ(scene);

Trackback URL for this post: http://davidejones.com/blog/1542-export-obj-alternativa3d/trackback/

Being Sociable...

  • If you like this article then please share it on your favourite social network and follow me on twitter for the latest updates

One Response to export .obj from alternativa3d

  • Pingback: Stage3D developer tips « 岩屋(乐在其中)

  • Leave a Reply

    Your email address will not be published. Required fields are marked *

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>