[Papervision3D]頂点動かして布のゆらめき その2

2009 年 2 月 22 日

3dyurameki2

3dyurameki2.swf

先日のエントリーで布がゆらめくような動きが表現してみましたが、今回は縦の動きも追加してみました。
物理学的にはデタラメな動きなんでしょうけどそれなりに布っぽくなったかな。。

画面クリックでマテリアル切替。

テクスチャに使ってる画像は下記のサイトのものを利用しました。
CG Tectures


package
{
	import caurina.transitions.Tweener;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import org.papervision3d.cameras.CameraType;
	import org.papervision3d.core.proto.CameraObject3D;
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.view.BasicView;

	/**
	 *
	 * @author modoki
	 */
	public class Main extends BasicView
	{
		private var mainObj:Plane;
		private var si:Number = 0.5;
		private var ROWS:int = 10;
		private var COLS:int = 20;
		private var material_a:BitmapFileMaterial;
		private var material_b:WireframeMaterial;

		public function Main():void
		{
			super(400, 400, true, true, CameraType.FREE);

			//-----------------------------
			// 初期カメラ設定
			//-----------------------------
			iniCam();

			//-----------------------------
			// MATERIAL
			//-----------------------------
			material_a = new BitmapFileMaterial("./img/golira.jpg");
			material_b = new WireframeMaterial();
			material_a.doubleSided = true;
			material_b.doubleSided = true;

			//-----------------------------
			// OBJECT
			//-----------------------------
			mainObj = new Plane(material_a, 600, 600, COLS, ROWS);
			mainObj.rotationY = 20;
			scene.addChild(mainObj);

			// Handler
			stage.addEventListener(MouseEvent.MOUSE_UP, clickHandler);

			// レンダリング開始
			startRendering();
		}

		/**
		 *-------------------------------------------------------
		 * カメラ初期化
		 *-------------------------------------------------------
		 */
		private function iniCam():void
		{
			// カメラ開始位置
			camera.moveBackward(4000);
			camera.moveUp(1000);
			camera.culled = true;

			// カメラ初期位置設定
			var iniCam:CameraObject3D = new CameraObject3D();
			iniCam.moveUp(400);

			// カメラ開始から初期位置まで移動
			Tweener.addTween( camera, {
				x			:iniCam.x,
				y			:iniCam.y,
				z			:iniCam.z,
				rotationX	:iniCam.rotationX,
				rotationY	:iniCam.rotationY,
				rotationZ	:iniCam.rotationZ,
				time		:5,
				transition	:"easeInOut"
				} );
		}

		/**
		 *-------------------------------------------------------
		 * Click
		 *-------------------------------------------------------
		 */
		private function clickHandler(e:MouseEvent):void
		{
			if (mainObj.material == material_a) {
				mainObj.material = material_b;
			} else {
				mainObj.material = material_a;
			}
		}

		/**
		 *-------------------------------------------------------
		 * onRenderTick
		 *-------------------------------------------------------
		 */
		override protected function onRenderTick(event:Event = null):void {
			si += 5;

			for ( var i:String in mainObj.geometry.vertices ) {
				var j:int = Number(i);

				mainObj.geometry.vertices[i].z = (Math.cos(Math.PI / 180 * (si * (j % (ROWS + 1)))) + 1) * 30;
				mainObj.geometry.vertices[i].y = (j % (ROWS + 1)) * ((Math.sin(Math.PI / 180 * (si + j)) + 2) * 30);
			}

			mainObj.pitch(1);

			super.onRenderTick(event);
		}
	}
}

タグ: , ,

コメントをどうぞ