Archive for April, 2009

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

Experiment #05: Rubik’s Cube

New BMW Z4 : Expression of Joy Campaign

宝马的新Z4发起以一场名为“Expression of Joy”的广告战役。核心概念就是让Z4在轮胎上涂抹颜料,然后驰骋在大型的场地上“作画”。同时推出的还有应用技术的互动程序。不过这个不是FLARToolKit的杰作,而是MagicSymbol公司的技术。虽然车的模型看上去比Papervision3D能实现的更为精细,但是必须要另外下载程序(PC Only)。

Project – KC Command Package v3.0

不知道大家是否还记得这一套Flash扩展,距离上次正式发布已经快四年的时间了。其实一直有在陆陆续续的整理和收集,但是由于工作重心转移的原因,Flash的项目做得越来越少,所以进度一直都很慢。

最近终于找了点时间把这套东西整理了一下,重新打包推出,改名为KC Command Package v3.0。主要的改动如下:

  1. 去掉了旧版所有的非命令扩展,主要是一些面板类的,因为太老久了,很多是AS2的东西,而且我也很少用。现在的v3.0只保留有用的JSFL命令,安装好以后从Flash的Command菜单调用就可以。
  2. 改写了部分命令,使其适用于AS3。
  3. 新增了数条从各个国外Blog收集的有用命令。
  4. 按照命令的功能重新分包(CS4的命令菜单可以支持子菜单了,避免了装太多命令后UI过长的问题)。但是分包以后,我发现在给命令分配快捷键上会有Bug,把你想加快捷键的命令移回根目录可能会解决这个问题。

v3.0的结构如下:

  • ActionScript
    辅助AS开发的命令:设置元件的基类、自动复制MC为public变量、将填充信息转为AS3代码等
  • Animate
    常用的动画辅助命令:移动到左上角、随机设置属性、随机设置缓动等
  • File
    文件类命令:自动发布一个目录下的所有文件等
  • Layer
    层操作相关的命令:复制层、锁定所有Mask层等
  • Library
    操作资源库的命令:批量更改位图属性、批量改名等。CS4的库面板功能有所增强,所以把旧版一些重复的命令去掉了
  • Setup
    自动插入常用的帧标签等命令
  • Utils
    其他常用的命令:去掉位置后面的小数点,快速插入stop帧等

大家可以去这里下载,欢迎在下面留言交流使用中遇到的问题。

注1:Package里的命令并非完全是我开发的,部分命令的著作权属于原作者(我都保留了作者信息)

注2:我没有打包成安装格式,请解压后自行复制到Flash的插件目录