Импорт модельки из 3Д МАКСА в 10 флеш.


Ну в 10 флеш элементарно можно импортировать трехмерную модельку, надеюсь вы читали микро-туториал про кубикам. Ну так в продолжении темы можно унаследоваться от класса Cube в виде класса Tea.as и получится уже не кубик, а чайник.

Класс для трехмерного чайника Tea.as является наследником класса Cube.as.

package {
	import flash.display.*;
	import flash.geom.*;

	public class Tea extends Cube{
		private var iMax:ImportMax;
		public function Tea(_treeD:ThreeD){
			super(_treeD);
		}
		override public function init():void {
			iMax = new ImportMax();
			pointS = iMax.points;
			facetS = iMax.facet;
		}
	}
}
Как видно довольно короткий код, но у некоторых особо пытливых пользователей может возникнуть вопрос, а что же это за ImportMax??? Спасибо, что обратили на него внимание.

ImportMax - класс данных для чайника.

package
{
	public class ImportMax 
	{
		public var points:Array;
		public var facet:Array;
		public function ImportMax() 
		{
			points = [];
			facet = [];
			init();
		}
		public function v(a:Number, b:Number, c:Number):void {
			points.push(a, b, c);	
		}
		public function f(_0:int, _1:int, _2:int, _3:int, _4:int, _5:int):void {
			facet.push([_0,_0,_1,_1,_2,_2]);	
		}
		public function uv(a:Number, b:Number):void {
		}
		public function init():void {
			//Определение точек
			v(49.7259,85.2444,0.0);
			v(49.1668,88.3522,0.0);
			...
			...
			Точечки это строки очень сильно похожие друг на друга (около 40 или больше штук)
			...
			...
			v(17.6413,91.9534,10.3613);
			v(32.5511,89.1909,19.1182);
			v(39.9491,85.2444,23.4632);
			//Определение граней
			f(0,4,5, 0,4,5);
			f(5,1,0, 5,1,0);
			...
			...
			...
			f(300,267,268, 506,510,511);
			f(268,301,300, 511,507,506);
		}
	}
}
Ну раз уж вы до сих пор со мной, задам вопрос на ответ, где же взять эти строчки, которые так похожи друг надруга. А... Нам понадобится специальный скриптик к 3Д максу, я о нем узнал случайно, пошарьте у siliren и вы его там найдете. Ну а я подсуну вам это файлик просто так Архив скриптика 3D MAX для конвертации моделек во флеш в виде классов. При использовании этого скриптика не надо заморациваться текстурами эффектами и пр., чем проще будет моделька тем лучше, у модельки должны быть как минимум грани для успешной конвертации. Словами рассказать трудно как им пользоваться, поэтому картинки.
В принципе нужны только строчки, которые начинаются на v и на f, остальное попросту не используется. Так же по сравнению с 4 кубиками изменился документ класс в котором теперь одна моделька, ну процессора она жрет многовато - 60% (amd semptron 1800Мгц), собчтвенно поэтому она и одна.

Документ класс для трехмерного чайника Tea3Doc.as.

package 
	{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	import __AS3__.vec.*;
	import flash.geom.*;
	
[SWF(width='400', height='400', backgroundColor='#123456', frameRate='24')]
	dynamic public class Tea3Doc extends MovieClip{ ;
		public var i:int,j:int,a:int,c:int,
			threeD:ThreeD,
			cubeArr:Array,
			spArr:Array,
			cube:Tea,
			sp:Sprite,
			distS:Array;
		public function Tea3Doc() {
			x = y = 200;

			threeD = new ThreeD();
			threeD.calcAngle();
			cubeArr = [];
			spArr = [];
			distS = [];

			cube = new Tea(threeD);
			addChild(sp = new Sprite());

			j=c=a=0;
			addEventListener(Event.ENTER_FRAME, enterFrameFunc);
		}
		private function enterFrameFunc(evt:Event):void {
			threeD.angleA+=1;
			threeD.angleB+=2;
			threeD.angleB-=3;
			threeD.calcAngle();

			cube.purelyDirt();
				
			threeD.rot(cube.dirtS, new Vector3D(100, 100, 0),new Vector3D(0, 1, 0), j++);


			cube.render(sp)
			
		}
	}
}
Так же изменился один метод в классе TreeD.as (на некоторых гранях чайника происходили засветы)

Метод отвечающий за цвет грани чайника

//расчитать цвет грани (работает только красный - пока)
		public function calcColor(_color:uint,_dist:Array,_index:int):uint{
			var color:uint;
			len = _dist.length;
			var dMin:Number = _dist[0][0];
			var dMax:Number = _dist[len-1][0];
			var dStep:Number = (dMax - dMin)/len;

			var rMin:uint = 0x00;
			var rMax:uint = 0xee;
			var cStep:Number = (rMax-rMin)/len;

			var r:uint;
			var g:uint = 0x00;
			var b:uint = 0x00;



			var ind:Number = (_dist[_index][0]-dMin)/dStep;
			r = uint(rMin+cStep*ind);
			if (r>rMax) r = rMin;
			color = ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);
			
			return color;
			
		}
архив, содержащий все классы проекта с Трехмерным чайником.