Я создаю приложение с помощью Flex фреймворка и библиотеки 3D-графики Flare3D .
Я хочу иметь возможность встроить свою 3D-сцену в приложение MXML и при этом отправлять события мыши на 3D-сцену.
Вот мой код:
- Приложение MXML:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:views="views.*"
minWidth="955" minHeight="600"
backgroundAlpha="0">
<s:HGroup width="100%" height="100%">
<s:Panel width="250" height="100%">
</s:Panel>
<views:MyView
id="myView"
width="100%" height="100%" />
</s:HGroup>
</s:Application>
UIComponent, ответственный за 3D-рендеринг (просто куб).
package views
{
import flare.basic.Scene3D;
import flare.basic.Viewer3D;
import flare.core.Camera3D;
import flare.primitives.Cube;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import mx.controls.Alert;
import mx.core.UIComponent;
public class MyView extends UIComponent
{
private var scene:Scene3D;
private var stage3D:Stage3D;
private var cube:Cube;
public function MyView()
{
super();
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
public function init(event:Event):void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
//stage.focus = null;
//stage.getChildAt(0).visible = false;
scene = new Viewer3D(stage);
scene.setViewport(250, 0);
scene.addEventListener(Scene3D.PROGRESS_EVENT, progressEvent);
scene.addEventListener(Scene3D.COMPLETE_EVENT, completeEvent);
scene.camera = new Camera3D();
scene.camera.setPosition(150, 150, -300);
scene.camera.lookAt(0, 0, 0);
cube = new Cube("cube");
scene.addChild(cube);
}
protected function progressEvent(e:Event):void {}
protected function completeEvent(e:Event):void {}
}
}
Проблема в том, что 3D-рендеринг по умолчанию выполняется в «слое», который находится за 2D-слоем (где мы можем разместить компоненты MXML).
По умолчанию, если мы смешиваем 3D и 2D элементы, мы не можем видеть 3D элементы.
Поэтому я добавил backgroundAlpha="0"
. Это решило проблему отображения 3D-вида.
Но теперь у меня есть другая проблема, я не могу переместить куб (который является поведением по умолчанию), когда я нажимаю на сцену и двигаю мышь.
Я понимаю, что это потому, что 3D-вид находится за 2D-видом.
Можно ли выделить трехмерное изображение для событий мыши (когда это необходимо)?
Или есть другой способ делать то, что я хочу?
Единственный хак, который я понял, - это раскомментировать //stage.getChildAt(0).visible = false;
, что делает 2D-видение невидимым. Но я хочу смешать 2D элементы и 3D вид, так что это не решение.
Спасибо за любую помощь.