Тема: [Papervision] InteractiveMovieMaterial
Показать сообщение отдельно
Старый 09.04.2009, 10:45
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 1  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Tools InteractiveMovieMaterial

Приветствую Вас.
Хочу реализовать в Papervision3D 2 плэйн с интерактивной текстурой, т.е. с мувиком сделанным во флэше.
Для этого объявляю в файле (далее ВНЕШНИЙ КОД) ComponentMaterialTest.as сцену, камеру, плэйн с этой текстурой... ну всё как полагается и в результате получается плэйн с MovieClip материалом:
Код AS3:
package
{
	import fl.core.UIComponent;
 
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	import flash.utils.getDefinitionByName;
 
	import org.papervision3d.cameras.CameraType;
	import org.papervision3d.materials.MovieAssetMaterial;
	import org.papervision3d.materials.MovieMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.view.BasicView;
	import org.papervision3d.view.stats.StatsView;
 
	public class ComponentMaterialTest extends Sprite
	{
		public var mc							:MovieClip;
 
 
		public var view							:BasicView = new BasicView(0,0, true, true, CameraType.FREE);
		public var plane						:Plane;
		public var mat							:MovieAssetMaterial;
		public var movieMat						:MovieMaterial;
		public var movie						:Sprite;
		public var uiCounter					:Number = 0;
 
		public function ComponentMaterialTest()
		{
			super();
			addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
		}
 
		protected function init(e:Event):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			stage.quality = StageQuality.MEDIUM;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_RIGHT;
 
			var RUSMAP:Class = getDefinitionByName("RUSSIA_MAP") as Class;
			movie = new RUSMAP() as Sprite;
			//movie.x = movie.y = -10000; 
			movie.x=movie.y=-1000;
 
			parseComponents();
			addChild(movie);
 
			view.camera.zoom = 20;
			view.camera.focus = 40;
 
			addChild(view);
			//addChild(new StatsView(view.renderer));
			addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
 
 
		}
 
		protected function createPlane():void
		{
			// Определяются размеры (границы) текстуры
			movieMat = new MovieMaterial( movie, true, true, false, new Rectangle(0,0,1024,512) );
			movieMat.oneSide = false;
			movieMat.setQuality(StageQuality.HIGH, stage, true);
			movieMat.interactive = true;
			movieMat.smooth = true;
 
			plane = new Plane(movieMat,1024,512,8,6);
			view.scene.addChild(plane);  
		}
 
		protected function loop(e:Event):void
		{
			var sw:Number=(stage.width+movie.x)/2;
			var sh:Number=(stage.height+movie.y)/2;
 
			var angleX:Number=(mouseX-sw)/40;
			plane.rotationY+=(angleX-plane.rotationY)*0.1;
 
			var angleY:Number=(mouseY-sh)/40;
			plane.rotationX+=(angleY-plane.rotationX)*0.1;		
 
			//trace("sw="+sw);
			view.singleRender();
		}		
 
		protected function handleComponentReady(e:Event):void
		{
			var uiComponent:UIComponent = UIComponent(e.currentTarget);
			uiComponent.removeEventListener(Event.ADDED_TO_STAGE, handleComponentReady);
			uiCounter--;
			if( uiCounter == 0 ) createPlane();
		}
 
		protected function parseComponents():void
		{
			uiCounter = 0;
			for( var i:int = 0; i<movie.numChildren; i++)
			{
				var mc:DisplayObject = DisplayObject(movie.getChildAt(i));
				if( mc is UIComponent ) 
				{
					mc.addEventListener(Event.ADDED_TO_STAGE, handleComponentReady, false, 0, true);
					uiCounter++;
				}
			}
			trace(uiCounter);
		}
	}
}
Рядом с файлом лежит флэш файл класса ComponentMaterialTest в котором и создана текстура(MovieClip) класса RUSSIA_MAP лежит в библиотеке. Эта текстура представляет из себя подобие слайдшоу. Т.е. картинки и кнопочки для переключения между ними(картинками). Так вот функции для кнопочек описаны внутри текстуры и работают только в этом мувике. Картинки переключаются и я всё это вижу на плэйне, который эффектно вращается.
ТЕПЕРЬ СУТЬ ВОПРОСА:
Я захотел при клике на кнопку текстуры передать сигнал во внешний код (вызвать функцию из ВНЕШНЕГО КОДА). Например скрыть Плэйн и показать Куб. Как это реализовать?
Нашёл некоторые примеры в гугле и обнаружил что там используется некий класс InteractiveMovieMaterial. Вот код одного японца:
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.cameras.FreeCamera3D;
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.InteractiveColorMaterial;
	import org.papervision3d.materials.InteractiveMovieMaterial;
	import org.papervision3d.materials.MaterialsList;
	import org.papervision3d.materials.MovieAssetMaterial;
	import org.papervision3d.materials.MovieMaterial;
	import org.papervision3d.objects.Cube;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.Plane;
	import org.papervision3d.scenes.InteractiveScene3D;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.utils.InteractiveSceneManager;
	import org.papervision3d.utils.InteractiveSprite;
 
	[SWF(width="400", height="300", frameRate="30", backgroundColor="#000000")]
	public class PaperVisionTest1 extends Sprite
	{
		protected var container 				:Sprite;
		protected var scene     				:InteractiveScene3D;
		protected var camera   					:Camera3D;
		protected var ism						:InteractiveSceneManager;
		protected var plane	 	 				:Plane;
		private var mycube:Cube;
 
		public function PaperVisionTest1():void
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
 
			init3D();
			createPlane();
			addEventListener(Event.ENTER_FRAME, loop);
		}
 
		protected function init3D():void {
			container = new InteractiveSprite();
			addChild(container);
			container.name = "mainCont";
			container.x = stage.stageWidth*.5;
			container.y = stage.stageHeight*.5;
 
			scene = new InteractiveScene3D(container);
			ism = scene.interactiveSceneManager;
 
			camera = new Camera3D();
			camera.zoom = 3;
			camera.focus = 100;
		}
 
		protected function createPlane():void {
			var c:CubeMaterial = new CubeMaterial();
			var c2:CubeMaterial = new CubeMaterial();
			var c3:CubeMaterial = new CubeMaterial();
			var material:MovieMaterial = new InteractiveMovieMaterial(c3, true, true);
			material.animated = true;
			material.smooth = true;
 
		var materials:MaterialsList = new MaterialsList(
		{
			//all:
			front:  new MovieMaterial(c, false, true),
			back:   new MovieMaterial(c, false, true),
			right:  new MovieMaterial(c2, false ,true),
			left:   new InteractiveMovieMaterial(c, false, true),
			top:    new MovieMaterial(c, false, true),
			bottom: new MovieMaterial(c)
		} );
			var mm:MovieMaterial = materials.getMaterialByName("right") as MovieMaterial;
			mm.texture.gotoAndStop(6);
			mm.doubleSided = true;
 
			mycube = new Cube( materials);
			scene.addChild(mycube);
			mycube.x = -300;
 
			plane = new Plane( material, 500, 500);
			plane.x = 600;
			plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleMainClick);
			mycube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleMainClick2);
			scene.addChild(plane);
		}
		protected function loop(event:Event):void {
			camera.x = -(container.mouseX * 3)/2;
			camera.y = (container.mouseY * 3);
			scene.renderCamera(camera);
		}
		protected function handleMainClick(e:InteractiveScene3DEvent):void {
			trace("mouse click from: ", e.currentTarget, e.displayObject3D, e.sprite, e.target);
			var do3d:DisplayObject3D = e.target as DisplayObject3D;
			var mm:MovieMaterial = e.target.material as MovieMaterial;
			mm.texture.gotoAndStop(Math.floor(Math.random() * 6) + 1);
		}
		protected function handleMainClick2(e:InteractiveScene3DEvent):void {
			trace("mouse click from: ", e.currentTarget, e.displayObject3D, e.sprite, e.target);
		}
	}
}
От куда у него этот:import org.papervision3d.materials.InteractiveMovieMaterial; ?
У меня Public Beta 2.0 - Great White December 3rd, 2008 и нет такого класса. Может кто то знает где его найти или какой то иной способ помочь мне решить задачу? Подскажите, люди добрые кто чем может