Posts Tagged ‘Quaternion’

RubiksCube’s Interactive Material Issue

有人问到RubiksCube怎么加互动材质的问题,抽空做了一下,需要注意的地方写在注释里了。
查看示例 | 下载(需要类库的去我之前那篇里面找)

跳转后查看详细代码。
More...

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