Интегрируйте Flare3D в приложение Flex - PullRequest
3 голосов
/ 23 ноября 2011

Я создаю приложение с помощью 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 вид, так что это не решение.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 08 января 2012

У меня была такая же проблема при работе с 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 голосов
/ 10 февраля 2012

Настройка backgroundAlpha="0" у меня сработала.

Я пытался заставить http://www.beyond -reality-face.com / sdk работать с Flex / Flash Builder.

Теперь я понимаю проблему. Приложение Flex является двухмерным и не прозрачным, поэтому backgroundAlpha="0" исправляет это.

Кроме того, stage3D не прозрачен, но примеры в SDK для лица уже учитывают это, рисуя веб-камеру в виде анимированной текстуры на плоскости Flare3D.

...