【问题标题】:AS3 DAE Augmented Reality PaperVision 3DAS3 DAE 增强现实 PaperVision 3D
【发布时间】:2010-10-14 22:56:49
【问题描述】:

我最近一直在玩增强现实(并且玩得很开心!!)我已经能够创建 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 项目中,而且效果很好!所以只是想知道是否有人在使用 AR 导入 DAE 方面有运气!

【问题讨论】:

    标签: flash actionscript-3 papervision3d


    【解决方案1】:

    Click here to view a video of the necessary imports and working demo on my site.

    我注意到您使用的是 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
    • 耐心

    -查找和准备模型

    • 为我的 Collada 文件使用 Google 3D Warehouse
    • 接下来将“.skp”sketchup 文件导入 Google Sketchup。
    • 确保sketchup 窗口具有焦点并同时按下CTRL 和A。 (全选)
    • 向上进行编辑,然后转到下拉列表的底部,通常会显示您选择了多少组。
    • 选择爆炸。
    • 重复直到你不能再爆炸。 (如果您使用的是应有的低多边形模型,这应该不会花很长时间。)
    • CTRL + A 再次全选。
    • 转到文件 > 导出 > 3D 模型并选择“.dae” //如果您没有 Sketchup,.dae 扩展名不可用,请查找解决方法 :) (本质上 .dae 包含在“.skp "
    • 您现在将拥有一个 .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();
            }
        }
    }
    

    }

    希望这一切对你有所帮助,我建议你继续玩它并不断熟悉它。

    【讨论】:

      【解决方案2】:

      @布雷迪,

      嘿,我认为这可能是错误:

      [嵌入(source="pat1.pat", mimeType="application/octet-stream")] private var CameraParameters:Class;

      [嵌入(source="pat1.pat", mimeType="application/octet-stream")] 私有变量 MarkerPattern:Class;

      您应该在“CameraParameters”处嵌入“camera_para.dat”而不是 - pat1.pat .试试这个。

      【讨论】:

        【解决方案3】:

        我实际上在this site 找到了一些很好的信息。我使用那里的代码将模型导入到我的 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);
                }
            }
        }
        

        【讨论】:

        • 想添加一个快速说明:确保您的标记可用于此代码!在这里,我的标记文件位于一个名为“data”的子文件夹中,所以不要忘记根据您的设置调整代码。
        猜你喜欢
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 2017-10-30
        • 2013-02-26
        • 2011-04-11
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多