2011-11-22 22 views
3

我正在用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視圖,所以它不是解決方案。

感謝您的任何幫助。

回答

1

我有與Alternativa3D和Flex 4.6完全相同的問題。我嘗試的是在應用程序標記中添加UIComponent而不是Panel標記,並且我的Flex和Stage3D鼠標事件都能正常工作。

因此,代碼如下所示:

<?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"> 

    <views:MyView 
     id="myView" 
     width="100%" height="100%" /> 

<s:HGroup width="100%" height="100%"> 

    <s:Panel width="250" height="100%"> 
    </s:Panel> 

</s:HGroup> 
</s:Application> 
+0

我會盡快對Flare進行測試,所以也許你的答案會被接受。我們已經參與了這個項目(並有很好的成績;-))。 – florian

0

設置backgroundAlpha="0"爲我工作。

我試圖讓http://www.beyond-reality-face.com/sdk與Flex/Flash Builder一起工作。

現在我明白了這個問題。 Flex應用程序是2D的,並且不透明,所以backgroundAlpha="0"解決了這個問題。

此外stage3D並不透明 - 但面部SDK中的示例已經通過將攝像頭作爲動畫紋理繪製到Flare3D平面上來解決這個問題。

相關問題