我正在用Flex框架和3D圖形庫Flare3D構建應用程序。
我希望能夠將我的3D場景嵌入到MXML應用程序中,並將鼠標事件分派到3D場景。將Flare3D集成到Flex應用程序中
這裏是我的代碼:
- 的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渲染默認情況下,在「層」,也就是二維層(在這裏我們可以把MXML組件)的後面進行。
默認情況下,如果我們混合使用3D和2D元素,則無法看到3D元素。
所以我加了backgroundAlpha="0"
。這解決了顯示3D視圖的問題。 但現在我有另一個問題,當我點擊場景並移動鼠標時,我無法移動多維數據集(這是默認行爲)。 我知道這是因爲3D視圖在2D視圖後面。
是否有可能爲3D視圖提供鼠標事件的焦點(何時需要)?
或者有什麼不同的方式做我想要的? 我唯一想到的就是取消這個使得2D視圖不可見的//stage.getChildAt(0).visible = false;
的註釋。但我想混合2D元素和3D視圖,所以它不是解決方案。
感謝您的任何幫助。
我會盡快對Flare進行測試,所以也許你的答案會被接受。我們已經參與了這個項目(並有很好的成績;-))。 – florian