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

2009 年 2 月 16 日

3dyurameki

3dyurameki.swf

 Paparvision3dで各ポリゴンの頂点をいじれるので、三角関数など規則性のある関数で処理してみたら布がゆらめくような動きが表現できました。なかなか面白い。
画面クリックでマテリアル切替。


package
{
	import flash.events.Event;
	import flash.events.MouseEvent;
	import org.papervision3d.cameras.CameraType;
	import org.papervision3d.core.proto.LightObject3D;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	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;
		private var material_a:GouraudMaterial;
		private var material_b:WireframeMaterial;

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

			// カメラ設定初期化
			camera.moveForward(200);
			camera.moveUp(400);
			camera.rotationX = 20;

			// ライト設定
			var light:LightObject3D = new LightObject3D();
			light.x = -500;
			light.y = 500;

			// Material
			material_a = new GouraudMaterial(light, 0xFFFFFF, 0x0000FF);
			material_b = new WireframeMaterial();
			material_a.doubleSided = true;
			material_b.doubleSided = true;

			// DisplayObject
			mainObj = new Plane(material_a, 800, 500, 10, 5);
			mainObj.rotationX = 90;
			scene.addChild(mainObj);

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

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

		/**
		 *-------------------------------------------------------
		 * 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 {
			// 回転
			mainObj.roll(-((mouseX - stage.width * .5) / (stage.width * .25)));

			// ゆらめき
			si += 10;
			for ( var i:String in mainObj.geometry.vertices ) {
				mainObj.geometry.vertices[i].z = Math.cos((si + (Number(i) * 5)) * Math.PI / 180) * 100;
			}

			super.onRenderTick(event);
		}
	}
}

タグ: , ,

コメント / トラックバック 1 件

  1. @24 より:

    はじめまして。
    布の動きを表現したくて、こちらの記事を元にwonderflでいじらせていただきました。
    もしあれだったら消しますので。。
    http://wonderfl.kayac.com/code/e0e3d0e463d68f3fc4cd6c063fdde611297fb2d9

コメントをどうぞ