Click here to view a video of the necessary imports and working demo on my site.
I notice that you are using the Collada Class, as opposed to the DAE, class, which both act a bit differently as is displayed in the video abobe.
It is also important to note that you may very well be doing this correctly and that there is a problem with the model or possibly even the texture. If the texture isn't loading you should know immediately from the console. Try creating a ColorMaterial and create a MaterialsList object setting the "all" property to the ColorMaterial you created. Finally pass the list to the instantiation of Collada or DAE Classes through the instantiation or load method. Also make sure that the camera isn't zoomed in to close, possibly leaving the 3D Object behind it. Finally play with the scale, not all models come in at the same scale, and using Collada class, as opposed to DAE, seems to blow the model up considerable as shown in the video link above.
I have had a lot of time to play with the FlarToolkit / Papervision3D / Collada partnership lately in preparations for the Tony Hawk XI website.
-What you need
- An IDE, I use FlashDevelop3 RC2, but Flex Builder or your IDE of choice will work.
- Papervision3D 2.0 Whiteshark, (latest build)
- Flex 3.3 SDK
- Patience
-Finding and prepping the model
- Use Google 3D Warehouse for my Collada files.
- Next take the ".skp" sketchup file into Google Sketchup.
- Make sure the sketchup window has focus and hit CTRL and A at the same time. (Select all)
- Head up to edit, and go down to the bottom of the drop-down list where it will typically say how many groups you have selected.
- Choose explode.
- Repeat until you cannot explode any more. (If you are using low-poly models like you are supposed to, this shouldn't take long.)
- CTRL + A to select all again.
- Goto File > Export > 3D Model and choose ".dae" //If you do not own Sketchup the .dae extension is not available, lookup the work around :) (Essentially the .dae is wrapped in the ".skp"
- You will now have a .dae file, and a folder with the same EXACT name, with textures pertaining to the model inside of it.
- Importing / parsing the model and displaying it
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();
}
}
}
}
Hopefully all this helps you, I suggest you just keep playing with it and keep familiarizing yourself with it.
The following is a link to a rather large explanation on PV3D/Flar toolkit AR
AS3 DAE Augmented Reality PaperVision 3D
-Questions
What IDE are you developing in? Flex Builder 3, Flash Develop, and Flash CS4 are all capable of handling embeds utilizing the Flex 3 SDK, BUT, Adobe Flash CS3 does not allow you to used embed and will not recognize it.
-Flash CS3 produces the following
TypeError: Error #1007: Instantiation attempted on a non-constructor.
at Untitled_fla::MainTimeline/Untitled_fla::frame1()
-The Following works in all the others listed above
[Embed(source="foo.jpg")] //<--- NO SEMICOLON OR BREAKS
private var foo:Class;
var testFoo:Bitmap = new foo();
-Important
One thing that I would like to note, notice there is no semicolon on the embed line!
Hope this helps, apparently the original poster figured his/her problem out, but wanted to answer sid.
Best Answer
Fenomas is right, this has to do with how the COLLADA data was made. There is some very specific work arounds that can be used to help cleanup the XML which is all COLLADA/DAE is.
I touched deeply on this all here.
Some people use things like Milk Shape 3D, or even Swift3D to export their XML. What I have found through my travels is that native COLLADA exporters from MAYA and MAX fail terribly. If your using 2008 version of either of the formerly named software, feelingsoftware.com makes a wonderful COLLADA(DAE) exporter that papervision loves!