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();
}
}
}