Fabrice, thank you for the reply. I did as you suggested and combined
the initPathAnimation code and the onModelLoaded method into one
method like below, but get
Error from ZoomFocusLens?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Error: isNaN(sz)
at away3d.cameras.lenses::ZoomFocusLens/project()[C:\Users\admin
\Adobe Flash Builder 4\CITYWALKTHROUGH\src\away3d\cameras\lenses
\ZoomFocusLens.as:106]
at away3d.core.project::MeshProjector/primitives()[C:\Users\admin
\Adobe Flash Builder 4\CITYWALKTHROUGH\src\away3d\core\project
\MeshProjector.as:152]
at away3d.core.traverse::PrimitiveTraverser/apply()[C:\Users\admin
\Adobe Flash Builder 4\CITYWALKTHROUGH\src\away3d\core\traverse
\PrimitiveTraverser.as:103]
at away3d.core.base::Object3D/traverse()[C:\Users\admin\Adobe Flash
Builder 4\CITYWALKTHROUGH\src\away3d\core\base\Object3D.as:1596]
at away3d.containers::ObjectContainer3D/traverse()[C:\Users\admin
\Adobe Flash Builder 4\CITYWALKTHROUGH\src\away3d\containers
\ObjectContainer3D.as:353]
at away3d.containers::View3D/render()[C:\Users\admin\Adobe Flash
Builder 4\CITYWALKTHROUGH\src\away3d\containers\View3D.as:964]
at testpath/onEnterFrame()[C:\Users\admin\Adobe Flash Builder
4\CITYWALKTHROUGH\src\testpath.as:211]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
Profuse apologies that this is elementary, but you said I should only
declare something when I am sure it is fully loaded. The onModelLoaded
method is only run when the
Loader3DEvent.LOAD_SUCCESS is fired, (and the md2 loads fine before
trying to add it to the pathAnimator). Should I be checking if the
pathAnimator is loaded? ( I haven't seen code doing that).
Code with initPathAnimation code and the onModelLoaded method
combined, as suggested by you:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
package
{
import away3d.animators.PathAnimator;
import away3d.animators.VertexAnimator;
import away3d.cameras.Camera3D;
import away3d.containers.ObjectContainer3D;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.core.base.Mesh;
import away3d.core.base.Object3D;
import away3d.core.geom.*;
import away3d.core.geom.Path;
import away3d.core.math.*;
import away3d.events.Loader3DEvent;
import away3d.loaders.Loader3D;
import away3d.loaders.Md2;
import away3d.loaders.utils.AnimationLibrary;
import away3d.materials.*;
import away3d.primitives.Cube;
import away3d.primitives.Plane;
import away3d.primitives.Sphere;
import away3d.primitives.Torus;
import flash.display.*;
import flash.events.*;
import flash.geom.Point;
import flash.utils.getTimer;
[SWF(backgroundColor="#cccccc", frameRate="60", quality="LOW",
width="800", height="600")]
public class testpath extends Sprite
{
[Embed(source="assets/dolphin_f.jpg" )]
private static var horse:Class;
private var scene:Scene3D;
private var _view:View3D;
private var cam:Camera3D;
private var m_modelMaterial:BitmapFileMaterial;
private var traveller:Object3D;
private var travellerCont:ObjectContainer3D;
private var horsePath:Path;
private var _scrub:Boolean = false;
private var _lastPoint:Point = new Point();
private var horseMesh:Mesh;
private var time:Number = 0;
private var pathAnimator:PathAnimator;
public function testpath(): void
{
initEngine();
loadModel();
//initAnimations();
initListeners();
}
private function initEngine():void{
cam = new Camera3D();
///cam.focus = 100;
//cam.zoom = 10;
//cam.x = 1000;
//cam.y = 200;
cam.z = -2000;
_view = new View3D();
_view.x = 400;
_view.y = 300;
scene = new Scene3D();
_view.scene = scene;
_view.camera = cam;
cam.lookAt(scene.position);
addChild(_view);
}
private function loadModel():void
{
m_modelMaterial = new
BitmapFileMaterial("assets/dolphin_f.jpg");
var loader:Loader3D = new Loader3D();
var md2:Md2 = new Md2();
md2.scaling = 8;
md2.material = m_modelMaterial;
loader.loadGeometry("assets/dolphin.md2", md2);
loader.addEventListener(Loader3DEvent.LOAD_SUCCESS,onModelLoaded);
//scene.addChild(loader);
}
private function onModelLoaded(event:Loader3DEvent):void
{
horseMesh = new Mesh();
horseMesh = event.loader.handle as Mesh ;
trace((horseMesh ).geometryLibrary);
var animdata:AnimationLibrary =
horseMesh.animationLibrary;
var myAnim:VertexAnimator =
animdata.getAnimation("jump").animator
as VertexAnimator;
myAnim.delay = 0;
myAnim.loop = true;
myAnim.fps = 5;
myAnim.interpolate = true;
myAnim.play();
//mesh.sortFaces = true;
//horseCont = new ObjectContainer3D(horseMesh);
horseMesh.z = 5000;
_view.scene.addChild(horseMesh);
var objectPath:Array = new Array();
objectPath.push(new Number3D(-2000, 200, 0), new
Number3D(0, -400,
600), new Number3D(2000, 200, 0));
objectPath.push(new Number3D(2000, 200, 0), new
Number3D(0, 0,
-300), new Number3D(6000, 1500, 0));
objectPath.push(new Number3D(6000, 1500, 0), new
Number3D(10000,
1000, -600), new Number3D(16000, 700, 0));
//create the path object to be used again for the path
animator
horsePath = new Path(objectPath);
//path = new HorsePath1();
var init:Object = {aligntoPath:true, offset:new
Number3D(0,200,0),
rotations:null, fps:24, easein:false, easeout:false}
pathAnimator = new PathAnimator(horsePath, horseMesh ,
init);
}
private function initListeners():void
{
addEventListener( Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(Event.RESIZE, onResize);
stage.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP,_onMouseUp);
stage.addEventListener(MouseEvent.MOUSE_OUT, _onMouseLeave);
onResize();
}
private function onResize(event:Event = null):void
{
_view.x = stage.stageWidth / 2;
_view.y = stage.stageHeight / 2;
//SignatureBitmap.y = stage.stageHeight - Signature.height;
}
/*private function initAnimations():void
{
}*/
private function _onMouseDown(ev : MouseEvent) : void
{
_scrub = true;
_lastPoint.x = stage.mouseX;
_lastPoint.y = stage.mouseY;
}
private function _onMouseUp(ev : MouseEvent) : void
{
_scrub = false;
stage.removeEventListener(Event.MOUSE_LEAVE,
_onMouseLeave);
}
private function _onMouseLeave(ev : Event) : void
{
_scrub = false;
stage.removeEventListener(Event.MOUSE_LEAVE,
_onMouseLeave);
}
private function onEnterFrame(event:Event): void{
if (pathAnimator) {
time += (time=0.001>1)?0:time+001;
pathAnimator.update(time);
}
if (_scrub) {
_view.camera.rotationX -= (stage.mouseY -
_lastPoint.y) /200 ;
_view.camera.rotationY += (stage.mouseX -
_lastPoint.x)/200;
}
// Move forward or backward
/*if (_keyUp) {
_view.camera.moveForward(15*Math.cos(_view.camera.rotationX*Math.PI/
180));
_view.camera.moveUp(-15*Math.sin(_view.camera.rotationX*Math.PI/
180));
} else if (_keyDown) {
_view.camera.moveBackward(15*Math.cos(_view.camera.rotationX*Math.PI/
180));
_view.camera.moveDown(-15*Math.sin(_view.camera.rotationX*Math.PI/
180));
}
// Sidestep left/right
if (_keyLeft) {
_view.camera.x -=
15*Math.cos(_view.camera.rotationY*Math.PI/180);
_view.camera.z +=
15*Math.sin(_view.camera.rotationY*Math.PI/180);
} else if (_keyRight) {
_view.camera.x +=
15*Math.cos(_view.camera.rotationY*Math.PI/180);
_view.camera.z -=
15*Math.sin(_view.camera.rotationY*Math.PI/180);
}*/
_view.render();
}
}
}
On Jan 25, 8:46 pm, Fabrice3D <[email protected]> wrote:
> just move your initPathAnimation(); to the "onModelLoaded" method,
> as you check if animator exist on enterframe, but you assume the target that
> it's supposed to update is there.
> it is a good practice to declare everything after you are sure all is loaded.
>
> a Prefab tip:
> if you keep windows of animator, path editor open
> select your md2 model, and play the sequence you want, you could debug the
> pathanimation, sequence speed etc
> and output most of your code in few secs...
>
> Fabrice
>
> On Jan 25, 2011, at 9:49 AM, bandy wrote:
>
> > Hi All,
> > I have been trying to get an animated md2 to move along a path using
> > pathanimator without any luck.
> > The error it gives is reproduced below.
>
> > I have tried with a Path class exported from Prefab, and also using a
> > path manually constructed from points.
> > The pathanimator works using both these paths when animating away3d
> > primitives, (but not md2)..
>
> > I have tried 2 different md2 files (a free horse.d2 and a dolphin.md2
> > that I found out about on this list).
> > The md2 loads and displays with its animation.
>
> > The problem occurs when the md2 mesh is then added to the
> > pathanimator, in particular in the PathAnimator.update() call. The
> > line with this call is triggering the errors in the Animator and
> > PathAnimator classes as reported in the error message.
>
> > I have no clue as to why an md2 might have an issue with update while
> > a primitive doesn't.
> > My code is below. Any help would be greatly appreciated!!!
>
> > Error message >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>
> > TypeError: Error #1009: Cannot access a property or method of a null
> > object reference.
> > at away3d.animators::PathAnimator/updateProgress()[C:\Users\admin
> > \Adobe Flash Builder 4\CITYWALKTHROUGH\src\away3d\animators
> > \PathAnimator.as:60]
> > at away3d.animators::Animator/set progress()[C:\Users\admin\Adobe
> > Flash Builder 4\CITYWALKTHROUGH\src\away3d\animators\Animator.as:202]
> > at away3d.animators::Animator/update()[C:\Users\admin\Adobe Flash
> > Builder 4\CITYWALKTHROUGH\src\away3d\animators\Animator.as:317]
> > at testpath/onEnterFrame()[C:\Users\admin\Adobe Flash Builder
> > 4\CITYWALKTHROUGH\src\testpath.as:177]
>
> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .
>
> > package
> > {
> > import away3d.animators.PathAnimator;
> > import away3d.animators.VertexAnimator;
> > import away3d.cameras.Camera3D;
> > import away3d.containers.ObjectContainer3D;
> > import away3d.containers.Scene3D;
> > import away3d.containers.View3D;
> > import away3d.core.base.Mesh;
> > import away3d.core.base.Object3D;
> > import away3d.core.geom.*;
> > import away3d.core.geom.Path;
> > import away3d.core.math.*;
> > import away3d.events.Loader3DEvent;
> > import away3d.loaders.Loader3D;
> > import away3d.loaders.Md2;
> > import away3d.loaders.utils.AnimationLibrary;
> > import away3d.materials.*;
> > import away3d.primitives.Cube;
> > import away3d.primitives.Plane;
> > import away3d.primitives.Sphere;
> > import away3d.primitives.Torus;
>
> > import flash.display.*;
> > import flash.events.*;
> > import flash.geom.Point;
> > import flash.utils.getTimer;
>
> > [SWF(backgroundColor="#cccccc", frameRate="60", quality="LOW",
> > width="800", height="600")]
> > public class testpath extends Sprite
> > {
> > [Embed(source="assets/dolphin_f.jpg" )]
> > private static var horse:Class;
>
> > private var scene:Scene3D;
> > private var _view:View3D;
> > private var cam:Camera3D;
> > private var m_modelMaterial:BitmapFileMaterial;
>
> > private var traveller:Object3D;
> > private var travellerCont:ObjectContainer3D;
> > private var horsePath:Path;
>
> > private var _scrub:Boolean = false;
>
> > private var _lastPoint:Point = new Point();
>
> > private var horseMesh:Mesh;
> > private var time:Number = 0;
>
> > private var pathAnimator:PathAnimator;
>
> > public function testpath(): void
> > {
> > initEngine();
> > loadModel();
> > initPathAnimation();
> > initListeners();
>
> > }
>
> > private function initEngine():void{
> > cam = new Camera3D();
> > ///cam.focus = 100;
> > //cam.zoom = 10;
> > //cam.x = 1000;
> > //cam.y = 200;
> > cam.z = -2000;
> > _view = new View3D();
> > _view.x = 400;
> > _view.y = 300;
> > scene = new Scene3D();
> > _view.scene = scene;
> > _view.camera = cam;
>
> > cam.lookAt(scene.position);
>
> > addChild(_view);
>
> > }
>
> > private function loadModel():void
> > {
> > m_modelMaterial = new
> > BitmapFileMaterial("assets/dolphin_f.jpg");
>
> > var loader:Loader3D = new Loader3D();
> > var md2:Md2 = new Md2();
> > md2.scaling = 8;
> > md2.material = m_modelMaterial;
>
> > loader.loadGeometry("assets/dolphin.md2", md2);
>
> >
> > loader.addEventListener(Loader3DEvent.LOAD_SUCCESS,onModelLoaded);
> > //scene.addChild(loader);
> > }
>
> > private function onModelLoaded(event:Loader3DEvent):void
> > {
> > horseMesh = new Mesh();
> > horseMesh = event.loader.handle as Mesh ;
> > trace((horseMesh ).geometryLibrary);
> > var animdata:AnimationLibrary =
> > horseMesh.animationLibrary;
> > var myAnim:VertexAnimator =
> > animdata.getAnimation("jump").animator
> > as VertexAnimator;
> > myAnim.delay = 0;
> > myAnim.loop = true;
> > myAnim.fps = 5;
> > myAnim.interpolate = true;
> > myAnim.play();
> > //mesh.sortFaces = true;
> > //horseCont = new ObjectContainer3D(horseMesh);
> > horseMesh.z = 5000;
>
> > _view.scene.addChild(horseMesh);
>
> > }
>
> > private function initListeners():void
> > {
> > addEventListener( Event.ENTER_FRAME, onEnterFrame);
> > stage.addEventListener(Event.RESIZE, onResize);
> > stage.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown);
> > stage.addEventListener(MouseEvent.MOUSE_UP,_onMouseUp);
> > stage.addEventListener(MouseEvent.MOUSE_OUT, _onMouseLeave);
> > onResize();
> > }
>
> > private function onResize(event:Event = null):void
> > {
> > _view.x = stage.stageWidth / 2;
> > _view.y = stage.stageHeight / 2;
> > //SignatureBitmap.y = stage.stageHeight - Signature.height;
> > }
>
> > private function initPathAnimation():void
> > {
> > var objectPath:Array = new Array();
>
> > objectPath.push(new Number3D(-2000, 200, 0), new
> > Number3D(0, -400,
> > 600), new Number3D(2000, 200, 0));
> > objectPath.push(new Number3D(2000, 200, 0), new
> > Number3D(0, 0,
> > -300), new Number3D(6000, 1500, 0));
> > objectPath.push(new Number3D(6000, 1500, 0), new
> > Number3D(10000,
> > 1000, -600), new Number3D(16000, 700, 0));
>
> > //create the path object to be used again for the path
> > animator
> > horsePath = new Path(objectPath);
> > //path = new HorsePath1();
>
> > var init:Object = {aligntoPath:true, offset:new
> > Number3D(0,200,0),
> > rotations:null, fps:24, easein:false, easeout:false}
> > pathAnimator = new PathAnimator(horsePath, horseMesh ,
> > init);
> > }
>
> > private function _onMouseDown(ev : MouseEvent) : void
> > {
> > _scrub = true;
> > _lastPoint.x = stage.mouseX;
> > _lastPoint.y = stage.mouseY;
>
> > }
> > private function _onMouseUp(ev : MouseEvent) : void
> > {
> > _scrub = false;
> > stage.removeEventListener(Event.MOUSE_LEAVE,
> > _onMouseLeave);
> > }
> > private function _onMouseLeave(ev : Event) : void
> > {
> > _scrub = false;
> > stage.removeEventListener(Event.MOUSE_LEAVE,
> > _onMouseLeave);
>
> > }
>
> > private function onEnterFrame(event:Event): void{
> > if (pathAnimator) {
> > time += (time=0.001>1)?0:time+001;
> > pathAnimator.update(time);
>
> > }
> > if (_scrub) {
> > _view.camera.rotationX -= (stage.mouseY -
> > _lastPoint.y) /200 ;
> > _view.camera.rotationY += (stage.mouseX -
> > _lastPoint.x)/200;
> > }
> > // Move forward or backward
> > /*if (_keyUp) {
>
> > _view.camera.moveForward(15*Math.cos(_view.camera.rotationX*Math.PI/
> > 180));
> >
> > _view.camera.moveUp(-15*Math.sin(_view.camera.rotationX*Math.PI/
> > 180));
> > } else if (_keyDown) {
>
> > _view.camera.moveBackward(15*Math.cos(_view.camera.rotationX*Math.PI/
> > 180));
> >
> > _view.camera.moveDown(-15*Math.sin(_view.camera.rotationX*Math.PI/
> > 180));
> > }
> > // Sidestep left/right
> > if (_keyLeft) {
>
> > _view.camera.x -=
> > 15*Math.cos(_view.camera.rotationY*Math.PI/180);
> > _view.camera.z +=
> > 15*Math.sin(_view.camera.rotationY*Math.PI/180);
> > } else if (_keyRight) {
> > _view.camera.x +=
> > 15*Math.cos(_view.camera.rotationY*Math.PI/180);
> > _view.camera.z -=
> > 15*Math.sin(_view.camera.rotationY*Math.PI/180);
> > }*/
> > _view.render();
> > }
> > }
> > }