官方教程 收藏本版 +发表新主题
查看: 22345|回复: 0
打印 上一主题 下一主题

开发基于FLARToolKit的增强现实(AR)基础教程(六)

[复制链接]

开发基于FLARToolKit的增强现实(AR)基础教程(六)

精华AngleYF 发表于 2013-5-29 10:43:44 浏览:  22345 回复:  0 只看该作者 复制链接
下面的这几步会更快一些,你做得非常好,所以坚持下去因为这是我们最后的障碍。让我们向我们的渲染循环中添加标记检测逻辑。改变renderViewport方法:
  1.     public function renderViewport(event:Event = null):void
  2.     {      
  3.             cardEmulator.render();
  4.             updateCaptureBitmap();
  5.            
  6.             try
  7.             {
  8.                       if (arDetector.detectMarker()) {
  9.                                arDetector.calculateTransformMatrix(resultMat);
  10.                                baseNode.setTransformMatrix(resultMat);
  11.                                active();
  12.                        }
  13.                       else
  14.                       {
  15.                                inactive();
  16.                        }
  17.               }
  18.             catch(errObject:Error) {
  19.                         trace(errObject.message);
  20.               }
  21.            
  22.             renderer.renderScene(scene, camera, viewport);
  23.     }

  24.     /**
  25.     * Displays the base node when a marker has been found.
  26.     */               
  27.     protected function active():void
  28.     {
  29.             if(!isActive)
  30.             {
  31.                       isActive = true;
  32.                       baseNode.visible = true;
  33.               }
  34.     }

  35.     /**
  36.     * Hides the base node when a marker can't be found.
  37.     */               
  38.     protected function inactive():void
  39.     {
  40.             if(isActive)
  41.             {
  42.                       baseNode.visible = false;
  43.                       isActive = false;
  44.               }
  45.     }
复制代码
声明的变量和导入的类包:
  1.     protected var resultMat:FLARTransMatResult = new FLARTransMatResult();
  2.     protected var isActive:Boolean = false;
  3.     protected var baseNode:FLARBaseNode;
  4.     import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
  5.     import org.libspark.flartoolkit.pv3d.FLARBaseNode;
复制代码

所以让我们来看一下发生了什么事情。每次我们调用renderViewport的时候我们会测试ARDetector是否检测到了标记,如果检测到了,那么我们要求ARDetector更新将要适用于baseNode的矩阵。baseNode将会显示主要的对象,并添加所有的papervision3d对象。下一步我们更新baseNode的图形信息(orientation)来匹配检测到的标记的图形信息。这些都是我们在使用FLARToolKit时该注意到的。如果这个标记仍然被探测到我们会调用active方法。Active简单地显示了baseNode。如果没有标记我们通过调用inactive来隐藏baseNode。

让我们通过改变setupPapervision方法来构建baseNode。

  1.     public function setupPapervision():void
  2.     {
  3.             scene = new Scene3D();
  4.             camera = new FLARCamera3D(arDetector.flarParam);

  5.             // Create the Viewport
  6.             viewport = new Viewport3D(stage.stageWidth, stage.stageHeight, true);
  7.             addChild(viewport);
  8.            
  9.             // The base node is where all PV3D object should be attached to.
  10.             baseNode = new FLARBaseNode();
  11.             scene.addChild(baseNode);
  12.            
  13.             create3dObjects();
  14.            
  15.             renderer = new BasicRenderEngine();
复制代码

这里我们创建了baseNode并把它添加到了scene中,同时,我们将摄像头改变成了FLARCamera3D,它需要一个flarParam属性来自于我们的ARDetector并将其放到正确的位置。


导入的类包:

  1.     import org.libspark.flartoolkit.pv3d.FLARCamera3D;
复制代码

FlarParam是一个匹配检测到的标记的图形信息的矩阵,FLARCamera3d是由FLARToolKit继承下来的一个自定义类,它会用来更容易地通过flarParam的阈值来调整摄像头。

下一步我们需要更新我们的默认的Plane,让他附加到baseNode上,调整它的rotation以使他以正确的角度面对摄像头。改变create3dObjects方法:

  1.     protected function create3dObjects():void
  2.     {
  3.             var plane:Plane = new Plane( new WireframeMaterial(0xff0000), 80, 80 );
  4.             plane.rotationX = 180;
  5.             baseNode.addChild(plane);
  6.     }
复制代码

我们做出来了!我们的ARDetector现在从CardEmulator正确地看到了我们的标记。你可以通过移动鼠标来体验!

注意到plane有时会消失么?这个是检测器失去标记然后使得baseNode不可见。为了便于举例我们如何将这个3d对象映射到仿真器的显示列表中,我们使captureSrc匹配了viewPort的大小。

  1.     protected function configureStage():void  
  2.     {  
  3.                 stage.quality = StageQuality.HIGH;
  4.          stage.align = StageAlign.TOP_LEFT;
  5.          stage.scaleMode = StageScaleMode.NO_SCALE;
  6.          stage.addEventListener(Event.RESIZE, onStageResize);
  7.     }

  8.     protected function onStageResize(event:Event = null):void
  9.     {
  10.             if(capturedSrc)
  11.                     resize(capturedSrc, stage.stageWidth, stage.stageHeight);
  12.             if(viewport)
  13.                     resize(viewport, stage.stageWidth, stage.stageHeight);
  14.     }

  15.     /**
  16.     * A function to resize any DisplayObject.
  17.     *
  18.     * @param target
  19.     * @param areaWidth
  20.     * @param areaHeight
  21.     * @param aspectRatio
  22.     *
  23.     */               
  24.     public function resize(target : DisplayObject, areaWidth : Number, areaHeight : Number, aspectRatio : Boolean = true, autoCenter:Boolean = true) : void {
  25.            
  26.             if(aspectRatio) {
  27.                      
  28.                       var sw : Number = areaWidth;
  29.                       var sh : Number = areaHeight;
  30.                       var tw : Number = target.width;
  31.                       var th : Number = target.height;
  32.             
  33.                       var si : Number;
  34.                       //
  35.                       if(sw > sh) {
  36.                                si = sw / tw;
  37.                                if(th * si > sh)
  38.                                si = sh / th;
  39.                        }else {
  40.                                si = sh / th;
  41.                                if(tw * si > sw )
  42.                                si = sw / tw;
  43.                        }
  44.             
  45.                       var wn : Number = tw * si;
  46.                       var hn : Number = th * si;
  47.             
  48.                       target.width = wn;
  49.                       target.height = hn;
  50.               }else {
  51.                       target.width = areaWidth;
  52.                       target.height = areaHeight;
  53.               }
  54.            
  55.             if(autoCenter)
  56.             {
  57.                       target.x = ((areaWidth * .5) - (target.width * .5));
  58.                       target.y = ((areaHeight * .5) - (target.height * .5));
  59.               }
  60.     }
复制代码

导入的类包:

import flash.display.DisplayObject;

将下面的这条语句添加到createCaptureSource方法的最下方:

onStageResize();

下一步我们会用来自摄像头的video替换captureSrc,我们要做的一件事便是偏移viewport使得pv3d对象正确地布局在标记上。







分享至:
| 人收藏
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.