我最近一直在玩增强现实(并且也从中获得了很多乐趣!!)我已经能够创建 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!
最佳答案
Click here to view a video of the necessary imports and working demo on my site.
我注意到您使用的是 Collada 类,而不是 DAE 类,两者的行为与视频 abobe 中显示的有所不同。
还需要注意的是,您很可能做得正确,但模型甚至纹理可能存在问题。如果纹理未加载,您应该立即从控制台知道。尝试创建一个 ColorMaterial 并创建一个 MaterialsList 对象,将“all”属性设置为您创建的 ColorMaterial。最后通过实例化或load方法将列表传递给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
- 耐心
-查找并准备模型
- 使用Google 3D Warehouse用于我的 Collada 文件。
- 接下来将“.skp”sketchup 文件导入 Google Sketchup。
- 确保 SketchUp 窗口具有焦点并同时按下 CTRL 和 A。 (全选)
- 向上进行编辑,然后转到下拉列表的底部,通常会显示您选择了多少组。
- 选择爆炸。
- 重复直到你不再爆炸。 (如果您按照预期使用低多边形模型,这应该不会花很长时间。)
- CTRL + A 再次选择全部。
- 转到"file">“导出”>“3D 模型”并选择“.dae”//如果您没有 Sketchup,则 .dae 扩展名不可用,请查找解决方法:)(本质上 .dae 包含在“.skp”中”
- 您现在将拥有一个 .dae 文件和一个具有相同名称的文件夹,其中包含与其中的模型相关的纹理。
- 导入/解析模型并显示它
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();
}
}
}
}
希望这一切对您有所帮助,我建议您继续使用它并不断熟悉它。
关于flash - AS3 DAE 增强现实 PaperVision 3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673059/