Приветствую Вас.
Хочу реализовать в 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 и нет такого класса. Может кто то знает где его найти или какой то иной способ помочь мне решить задачу? Подскажите, люди добрые кто чем может
