
Код AS3:
private function getRotationFrom3DSAngleAxis(angle:Number, x:Number, z:Number, y:Number) : Vector3D
{
var half:Number = NaN;
var res:Vector3D = new Vector3D();
var s:Number = Math.sin(angle);
var c:Number = Math.cos(angle);
var t:Number = 1 - c;
var k:Number = x * y * t + z * s;
if(k >= 1)
{
half = angle / 2;
res.z = -2 * Math.atan2(x * Math.sin(half),Math.cos(half));
res.y = -Math.PI / 2;
res.x = 0;
return res;
}
if(k <= -1)
{
half = angle / 2;
res.z = 2 * Math.atan2(x * Math.sin(half),Math.cos(half));
res.y = Math.PI / 2;
res.x = 0;
return res;
}
res.z = -Math.atan2(y * s - x * z * t,1 - (y * y + z * z) * t);
res.y = -Math.asin(x * y * t + z * s);
res.x = -Math.atan2(x * s - y * z * t,1 - (x * x + z * z) * t);
return res;
}
public function parse(data:ByteArray, texturesBaseURL:String = "", scale:Number = 1) : void
{
if(data.bytesAvailable < 6)
{
return;
}
this.data = data;
data.endian = Endian.LITTLE_ENDIAN;
this.parse3DSChunk(data.position,data.bytesAvailable);
this.objects = new Vector.<Object3D>();
this.parents = new Vector.<Object3D>();
this.materials = new Vector.<Material>();
this.textureMaterials = new Vector.<TextureMaterial>();
this.buildContent(texturesBaseURL,scale);
data = null;
this.objectDatas = null;
this.animationDatas = null;
this.materialDatas = null;
}
private function parseMaterialName(material:MaterialData) : void
{
if(this.materialDatas == null)
{
this.materialDatas = new Object();
}
material.name = this.getString(this.data.position);
this.materialDatas[material.name] = material;
}
private function parseMatrix(object:ObjectData) : void
{
object.a = this.data.readFloat();
object.e = this.data.readFloat();
object.i = this.data.readFloat();
object.b = this.data.readFloat();
object.f = this.data.readFloat();
object.j = this.data.readFloat();
object.c = this.data.readFloat();
object.g = this.data.readFloat();
object.k = this.data.readFloat();
object.d = this.data.readFloat();
object.h = this.data.readFloat();
object.l = this.data.readFloat();
}
private function parseFacesChunk(object:ObjectData, dataPosition:int, bytesAvailable:int) : void
{
if(bytesAvailable < 6)
{
return;
}
var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
switch(chunkInfo.id)
{
case CHUNK_FACESMATERIAL:
this.parseSurface(object);
}
this.parseFacesChunk(object,chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
}
private function parseSurface(object:ObjectData) : void
{
if(object.surfaces == null)
{
object.surfaces = new Object();
}
var surface:Vector.<int> = new Vector.<int>();
object.surfaces[this.getString(this.data.position)] = surface;
var num:int = this.data.readUnsignedShort();
for(var i:int = 0; i < num; i++)
{
surface[i] = this.data.readUnsignedShort();
}
}
private function parseObjectChunk(object:ObjectData, dataPosition:int, bytesAvailable:int) : void
{
if(bytesAvailable < 6)
{
return;
}
var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
switch(chunkInfo.id)
{
case CHUNK_TRIMESH:
this.parseMeshChunk(object,chunkInfo.dataPosition,chunkInfo.dataSize);
break;
case 17920:
break;
case 18176:
}
this.parseObjectChunk(object,chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
}
private function parse3DSChunk(dataPosition:int, bytesAvailable:int) : void
{
if(bytesAvailable < 6)
{
return;
}
var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
this.data.position = dataPosition;
switch(chunkInfo.id)
{
case CHUNK_MAIN:
this.parseMainChunk(chunkInfo.dataPosition,chunkInfo.dataSize);
}
this.parse3DSChunk(chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
}
}
}
class MapData
{
public var offsetU:Number = 0;
public var offsetV:Number = 0;
public var filename:String;
public var scaleU:Number = 1;
public var scaleV:Number = 1;
public var rotation:Number = 0;
function MapData()
{
super();
}
}
import flash.geom.Vector3D;
import alternativa.engine3d.core.Object3D;
class AnimationData
{
public var pivot:Vector3D;
public var isInstance:Boolean;
public var parentIndex:int;
public var position:Vector3D;
public var objectName:String;
public var scale:Vector3D;
public var rotation:Vector3D;
public var object:Object3D;
function AnimationData()
{
super();
}
}
import flash.geom.Matrix;
import alternativa.engine3d.materials.Material;
class MaterialData
{
public var matrix:Matrix;
public var specular:int;
public var material:Material;
public var color:int;
public var name:String;
public var opacityMap:MapData;
public var transparency:int;
public var diffuseMap:MapData;
public var glossiness:int;
function MaterialData()
{
super();
}
}
class ChunkInfo
{
public var nextChunkPosition:int;
public var size:int;
public var dataPosition:int;
public var dataSize:int;
public var id:int;
function ChunkInfo()
{
super();
}
}
class ObjectData
{
public var name:String;
public var a:Number;
public var b:Number;
public var c:Number;
public var e:Number;
public var surfaces:Object;
public var g:Number;
public var h:Number;
public var i:Number;
public var j:Number;
public var d:Number;
public var f:Number;
public var uvs:Vector.<Number>;
public var l:Number;
public var faces:Vector.<int>;
public var vertices:Vector.<Number>;
public var k:Number;
function ObjectData()
{
super();
}
}