Quaternion Rotation Demo

昨天发布的RubiksCube控制旋转部分的代码是操作根据物体自身的坐标,觉得还是有点怪,所以今天花了点时间改写了一下:实现了世界坐标的旋转。主要是解决了坐标系换算的问题,方法是用Quaternion生成旋转矩阵。代码贴出来,给有需要的朋友。

package {
	import org.papervision3d.core.math.Quaternion;
	import org.papervision3d.core.proto.LightObject3D;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.view.BasicView;
 
	import flash.events.*;	
 
	/**
	 * @author kevincao
	 */
	public class RotateControlDemo extends BasicView {
 
		protected var cube : Cube;
 
		private var isDown : Boolean = false;
 
		private var _x : Number;
		private var _y : Number;
 
		private var _vx : Number = 0;
		private var _vy : Number = 0;
 
		public function RotateControlDemo() {
			init();
		}
 
		protected function init() : void {
			var light : LightObject3D = new LightObject3D();
			light.x = 1000;
			light.y = 1000;
			light.z = -1000;
			cube = new Cube(new MaterialsList({all : new FlatShadeMaterial(light)}), 300, 300, 300);
			scene.addChild(cube);
 
			addEventListener(Event.ENTER_FRAME, tick);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
		}
 
		private function downHandler(event : MouseEvent) : void {
			_x = mouseX;
			_y = mouseY;
			isDown = true;
			stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
		}
 
		private function upHandler(event : MouseEvent) : void {
			isDown = false;
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
		}
 
		private function moveHandler(event : MouseEvent) : void {
			_vx = (mouseX - _x) * .4;
			_vy = (mouseY - _y) * .4;
			_x = mouseX;
			_y = mouseY;
 
			var q : Quaternion = Quaternion.createFromEuler(-_vx, 0, -_vy, true);
			cube.transform.calculateMultiply3x3(q.matrix, cube.transform);
		}
 
		private function tick(event : Event) : void {
			if(!isDown) {
				if(_vx != 0 || _vy != 0) {
					_vx *= .9;
					_vy *= .9;
					if(Math.abs(_vx) < .5) {
						_vx = 0;
					}
					if(Math.abs(_vy) < .5) {
						_vy = 0;
					}
					var q : Quaternion = Quaternion.createFromEuler(-_vx, 0, -_vy, true);
					cube.transform.calculateMultiply3x3(q.matrix, cube.transform);
				}
			}
			singleRender();
		}
	}
}
Bookmark and Share

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

Comments :

  • At 2009.04.20 01:49, thinkingPoly said:

    高科技,昨天那个水平旋转90°后上下旋转控制就反了

Related Posts :