Papervision3DとTweenerで地図を斜めに置いて回転させる

http://web.sfc.keio.ac.jp/~shokai/archive/as3/0804_Pv3d/Pv3dTest/Pv3dTest.html
http://web.sfc.keio.ac.jp/~shokai/archive/as3/0804_Pv3d/Pv3dTest/
キーボードの数字0〜7キーで回転する

package  {
	import flash.display.*;
	import flash.events.*;
	import flash.net.*;
	import org.papervision3d.core.proto.MaterialObject3D;
	import org.papervision3d.scenes.*;
	import org.papervision3d.cameras.*;
	import org.papervision3d.objects.*;
	import org.papervision3d.materials.*;
	import caurina.transitions.Tweener;

	/**
	* 地図を斜めに配置して、視点を回す
	* @author Sho Hashimoto
	*/
	public class Pv3dTest extends Sprite {

		var pv3stage:Sprite;
		var scene:Scene3D;
		var camera:Camera3D;
		var planeMap:DisplayObject3D;
		var sky:Loader;
		var mapMask:Loader;
		
		public function Pv3dTest() {
			stage.scaleMode = StageScaleMode.EXACT_FIT; // 伸縮する
			// stage.scaleMode = StageScaleMode.NO_SCALE; // 伸縮しない
			stage.align = StageAlign.TOP_LEFT; // 左上から
			
			sky = new Loader();
			sky.load(new URLRequest("sky.png"));
			addChild(sky);
			
			pv3stage = new Sprite();
			addChild(pv3stage);
			
			mapMask = new Loader();
			mapMask.load(new URLRequest("mask.png"));
			addChild(mapMask);
			
			pv3stage.x = 400;
			pv3stage.y = 400;
			scene = new Scene3D(pv3stage);
			
			var map:BitmapFileMaterial = new BitmapFileMaterial("map.png");
			planeMap = new Plane(map, 20000, 20000, 8, 8 );
			planeMap.z = 1000;
			scene.addChild(planeMap);
			
			camera = new Camera3D();
			camera.x = 0;
			camera.y = -100;
			camera.z = -250;
			scene.renderCamera(camera);

			stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		function onKeyPress(event:KeyboardEvent):void {
			trace(event.keyCode);
			var direction:int = (event.keyCode - 48) * 45;
			if (0 <= direction && direction <= 360) {
				if (direction - planeMap.rotationZ > 180) direction -= 360; // 距離が短い方向に回転
				else if (planeMap.rotationZ - direction > 180) direction += 360;
				Tweener.addTween(planeMap, { rotationZ:direction, time:1, transition:"liner" } );
			}
		}
		
		function onEnterFrame(e:Event):void {
			scene.renderCamera(camera);			
		}
	}

}