AS3 DAE дополненной реальности PaperVision 3D - PullRequest
2 голосов
/ 23 марта 2009

Я недавно играл с дополненной реальностью (и мне тоже очень весело!) Я смог создать примитивы PaperVision (куб, цилиндр, конус и т. Д. И работать с ними), но добавив DAE модель оказывается призрачной!

var cubeMaterialList:MaterialsList = new MaterialsList( { all: new FlatShadeMaterial(light, 0x0099FF, 0x0066AA) } );

            var cube:Cube = new Cube(cubeMaterialList,
                                     30,
                                     30,
                                     30);

            cube.z += 15;

            mainContainer.addChild(cube);

Это все отлично работает!

Я использую это, чтобы импортировать / пытаться импортировать dae!

private var mCollada:Collada;
private var universe:DisplayObject3D;
mCollada = new Collada("sample.dae");
universe = new DisplayObject3D();
universe.addChild(mCollada);
        mainContainer.addChild(universe);

Я использовал этот метод импорта DAE в проекты PaperVision без дополненной реальности, и он отлично работает! Так что просто интересно, если кому-нибудь повезло с импортом DAE с AR!

Ответы [ 3 ]

3 голосов
/ 31 марта 2009

Нажмите здесь, чтобы просмотреть видео о необходимом импорте и рабочую демонстрацию на моем сайте.

Я заметил, что вы используете класс Collada, в отличие от класса DAE, который действует немного по-разному, как это показано в видеообъявлении.

Также важно отметить, что вы вполне можете делать это правильно и что есть проблема с моделью или даже текстурой. Если текстура не загружается, вы должны немедленно узнать об этом из консоли. Попробуйте создать ColorMaterial и создать объект MaterialsList, установив для свойства «all» созданный вами ColorMaterial. Наконец, передайте список экземплярам классов Collada или DAE с помощью метода создания экземпляров или загрузки. Также убедитесь, что камера не увеличена, чтобы закрыть, возможно, оставляя 3D-объект позади него. Наконец, поиграйте с масштабом, не все модели входят в один и тот же масштаб, и использование класса Collada, в отличие от DAE, похоже, значительно подорвет модель, как показано в видео ссылке выше.

В последнее время у меня было много времени, чтобы поиграть с партнерством FlarToolkit / Papervision3D / Collada в подготовке сайта Tony Hawk XI.

-Что вам нужно

  • IDE, я использую FlashDevelop3 RC2, но Flex Builder или выбранная вами среда IDE будут работать.
  • Papervision3D 2.0 Whiteshark, (последняя сборка)
  • Flex 3.3 SDK
  • Patience

- Поиск и подготовка модели

  • Используйте Google 3D Warehouse для моих файлов Collada.
  • Затем перенесите файл с эскизом ".skp" в Google Sketchup.
  • Убедитесь, что у окна SketchUp есть фокус, и одновременно нажмите CTRL и A. (Выбрать все)
  • Пройдите вверх, чтобы редактировать, и спуститесь в нижнюю часть раскрывающегося списка, где обычно будет указано, сколько групп вы выбрали.
  • Выберите взорваться.
  • Повторяйте, пока не сможете больше взорваться. (Если вы используете низкополигональные модели, как это должно быть, это не займет много времени.)
  • CTRL + A, чтобы снова выбрать все.
  • Перейдите в Файл> Экспорт> 3D-модель и выберите «.dae» // Если у вас нет Sketchup, расширение .dae недоступно, ищите обходной путь :) «
  • Теперь у вас будет файл .dae и папка с тем же именем EXACT с текстурами, относящимися к модели внутри него.

- Импорт / анализ модели и ее отображение

package 
{
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.utils.ByteArray;
    import org.libspark.flartoolkit.core.FLARCode;
    import org.libspark.flartoolkit.core.param.FLARParam;
    import org.libspark.flartoolkit.core.raster.rgb.FLARRgbRaster_BitmapData;
    import org.libspark.flartoolkit.core.transmat.FLARTransMat;
    import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
    import org.libspark.flartoolkit.detector.FLARSingleMarkerDetector;
    import org.libspark.flartoolkit.pv3d.FLARBaseNode;
    import org.libspark.flartoolkit.pv3d.FLARCamera3D;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.render.LazyRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.objects.parsers.Collada;
    import org.papervision3d.objects.parsers.DAE;
/**
 * ...
 * @author Brian Hodge
 */
public class Main extends Sprite 
{
    [Embed(source="../lib/camera_para.dat", mimeType="application/octet-stream")]
    private var CameraParameters:Class;

    [Embed(source="../lib/collada.pat", mimeType="application/octet-stream")]
    private var MarkerPattern:Class;

    private var cameraParameters:FLARParam;
    private var markerPattern:FLARCode;
    private var raster:FLARRgbRaster_BitmapData;
    private var detector:FLARSingleMarkerDetector;

    private var cam:Camera;
    private var vid:Video;
    private var capture:BitmapData;

    private var cam3D:FLARCamera3D;
    private var scene3D:Scene3D;
    private var viewPort:Viewport3D;
    private var mainContainer:FLARBaseNode;
    private var renderer:LazyRenderEngine;

    private var trans:FLARTransMatResult;
    private var prevSet:Boolean = false;
    private var prevZ:Number = 0;

    private var _collada:Collada;
    private var _dae:DAE;

    public function Main():void 
    {
        cameraParameters = new FLARParam();
        cameraParameters.loadARParam(new CameraParameters() as ByteArray);

        markerPattern = new FLARCode(16, 16);
        markerPattern.loadARPatt(new MarkerPattern());

        cam = Camera.getCamera();
        cam.setMode(640, 480, 30);

        vid = new Video();
        vid.width = 640;
        vid.height = 480;
        vid.attachCamera(cam);
        addChild(vid);

        capture = new BitmapData(vid.width, vid.height, false, 0x0);
        capture.draw(vid);

        raster = new FLARRgbRaster_BitmapData(capture);
        detector = new FLARSingleMarkerDetector(cameraParameters, markerPattern, 80);

        cam3D = new FLARCamera3D(cameraParameters);

        scene3D = new Scene3D();

        mainContainer = new FLARBaseNode();
        scene3D.addChild(mainContainer);

        viewPort = new Viewport3D(vid.width, vid.height);
        viewPort.scaleX = viewPort.scaleY = 2;
        addChild(viewPort);

        renderer = new LazyRenderEngine(scene3D, cam3D, viewPort);

        _dae = new DAE();
        _dae.load("assets/dae/apc.dae");
        _dae.rotationZ -= 90;
        mainContainer.addChild(_dae);

        /*
        _collada = new Collada("assets/dae/apc.dae");
        _collada.scale = 0.05;
        _collada.rotationZ -= 90;
        mainContainer.addChild(_collada);
        */

        trans = new FLARTransMatResult();

        this.addEventListener(Event.ENTER_FRAME, mainEnter);
    }
    private function mainEnter(e:Event):void 
    {
        capture.draw(vid);

        if (detector.detectMarkerLite(raster, 80) && detector.getConfidence() > 0.5)
        {
            detector.getTransformMatrix(trans);

            mainContainer.setTransformMatrix(trans);
            mainContainer.visible = true;
            renderer.render();
        }
        else
        {
            mainContainer.visible = false;
            renderer.render();
        }
    }
}
* *} Тысяча сорок-девять

Надеюсь, все это поможет вам, я предлагаю вам просто поиграть с ним и продолжать знакомиться с ним.

0 голосов
/ 24 февраля 2010

Я нашел хорошую информацию на этом сайте . Я использовал этот код для импорта моделей в AR. Он описывает очень простой метод для импорта моделей Collada. Я просто взял пример примера FlarToolkit (пример simpleCube) и добавил код в эту статью, и этого было достаточно, чтобы я начал работать.

Вот код:

package {
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.utils.*;
    import org.papervision3d.materials.shadematerials.*;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.objects.primitives.Cylinder;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.parsers.Collada;
    import flash.events.*;

    public class SimpleCube extends PV3DARApp {

        public var FAlogo:DisplayObject3D;
        public var light                        :PointLight3D;

        public function SimpleCube() {
            this.init('Data/camera_para.dat', 'Data/flarlogo.pat');
        }

        protected override function onInit():void {
            super.onInit();
            this.addEventListener( Event.ENTER_FRAME, EROnEnterFrame );

            // let there be light
            this.light = new PointLight3D;
            this.light.x = 0;
            this.light.y = 1000;
            this.light.z = -1000;

            // cow model
            FAlogo = new Collada("http://papervision2.com/wp-content/downloads/dae/cow.dae");
            FAlogo.rotationZ = -90;
            FAlogo.rotationY = -90;
            FAlogo.x = -100;
            FAlogo.z = 100;
            FAlogo.scale = 0.1;

            // re-orient the logo model before adding it to the scene

            this._baseNode.addChild(this.FAlogo);
        }

        private function EROnEnterFrame( event :Event ):void
        {
            // spins the cow yay!
            FAlogo.yaw(3);
        }
    }
}
0 голосов
/ 03 июня 2009

@ Brady,

Эй, я думаю, что это может быть ошибкой:

[Embed (source = "pat1.pat", mimeType = "application / octet-stream")] частная переменная CameraParameters: класс;

[Embed (source = "pat1.pat", mimeType = "application / octet-stream")] частный var MarkerPattern: Class;

Здесь, в «CameraParameters», вы должны вставлять «camera_para.dat», а не - pat1.pat , попробуйте с этим.

...