Morioka.as lab(0x05)でAR(拡張現実)

10月30日、Morioka.as->lab(0x05)に参加してきました。

自分は通常発表とLTをやってきました。
他の方の発表など感想は別エントリーで。

ustの映像は記録されてなかったみたい(?)なので、Morioka.as終わってホテルに戻ってから、デモ部分の再現動画を撮って追加してみました。

通常発表のプレゼン資料はこちら。

通常発表デモ部分再現動画
http://katahirado.jp/AR-Rails.mov
デモで何をやっているのかというと、自宅サーバに用意しておいたRailsアプリからメッセージ一覧のXMLをGETして、その中からランダムにメッセージを選択、ARで表示させています。Timerのイベントで都度取得しに行っているので、デモ途中でサイトに追加したメッセージも表示されてますよね。
当日のデモでは、参加者の方にメッセージを投稿してもらってたら、途中でエラーになっちゃったんですけど、後でコードしらべてみたら、Timerのイベント発生のタイミングが2秒になっちゃってたので、しくじったりしてたみたいです。
3秒間隔で作ってたはずなのに、いつの間に2秒にしちゃったんだろ。
マーカー部分からメッセージが飛び出すアニメーションではTweenerを使用してます。

後はPapervision3DのText3Dで、日本語表示させるのにPotrAsを使用。
これに関しては、こちらを参考にというかそのままです。ありがとうございました。


テーマLTのプレゼン資料はこちら。

テーマLTデモ部分再現動画
http://katahirado.jp/AR-Torus.mov

LTのプレゼン資料の文面で一部おかしいのは、LT→通常という流れに沿って作っていたから。順番が逆になってしまい、微妙に修正が間に合わなかったと。
後、ARといったら真っ先にActiveRecordが浮かんだんですけど、知らない人の方が圧倒的多数かと思ったので自重しました。

ワイヤーフレームと色だけでドーナツを表現してみました。
7個ドーナツが重なるとなかなか壮観かなと。
ロジックとしては単純です。ARとかこういうのはアイデア勝負ですよね。
やっつけで作ったソースはこちら。これだけでは動かないので、別途ライブラリなどご用意いただければ動作しますよ〜。

package
{

	import com.topflashers.ext.pv3d.objects.primitives.Torus;
	
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.materials.special.CompositeMaterial;
	import org.papervision3d.materials.special.Letter3DMaterial;
	import org.papervision3d.typography.Text3D;

	[SWF(width=640,height=480,backgroundColor=0x0,frameRate=30)]

	public class ARdonut extends PV3DARApp
	{

		private var _donutArray:Array=[];
		private var _donut:Torus;
		private var _largeRadius:int=40; //外周半径
		private var _smallRadius:int=15; //内周半径
		private var _segmentW:int=12; //旋回の分割数
		private var _segmentH:int=6; //断面の頂点数
		private var _count:int=1;
		private var _eat:Boolean=false;
		private var _letterformat:Letter3DMaterial;
		private var _textdata:Text3D;
		private var _eatCount:int=0;

		public function ARdonut()
		{
			// カメラ補正ファイルとパターン定義ファイルのファイル名を渡して初期化。
			this.init('Data/camera_para.dat', 'Data/flarlogo.pat');
		}

		protected override function onInit():void
		{
			super.onInit(); // 必ず呼ぶ。

			// ライトの設定。手前、上のほう。
			var light:PointLight3D=new PointLight3D();
			light.x=0;
			light.y=1000;
			light.z=-1000;

			//マテリアル設定
			var colorMaterial:ColorMaterial=new ColorMaterial(0xae8750, 1);
			var wireMaterial:WireframeMaterial=new WireframeMaterial(0x963400);
			var compoMaterial:CompositeMaterial=new CompositeMaterial();
			compoMaterial.addMaterial(colorMaterial);
			compoMaterial.addMaterial(wireMaterial);

			//donutオブジェクト生成
			this._donut=new Torus(compoMaterial, _largeRadius, _smallRadius, _segmentW, _segmentH);
			this._donut.rotationX=180;
			this._baseNode.addChild(this._donut);
			this._donutArray.push(this._donut);
			stage.addEventListener(MouseEvent.CLICK, onClick);

		}

		private function onClick(event:Event):void
		{
			eat_or_add();
		}

		private function eat_or_add():void
		{
			if (_eat == false)
			{
			 this._baseNode.removeChild(textdata); 
				donut_add();
			}
			else if (this._eat == true)
			{
				donut_eat();
			}
		}

		private function donut_add():void
		{
			if (_count < 7)
			{
				var colorMaterial:ColorMaterial=new ColorMaterial(0xae8750, 1);
				var wireMaterial:WireframeMaterial=new WireframeMaterial(0x963400);
				var compoMaterial:CompositeMaterial=new CompositeMaterial();
				compoMaterial.addMaterial(colorMaterial);
				compoMaterial.addMaterial(wireMaterial);

				//donutオブジェクト生成
				_donut=new Torus(compoMaterial, _largeRadius, _smallRadius, _segmentW, _segmentH);
				_donut.rotationX=180;
				_donut.rotationX=180;
				this._baseNode.addChild(_donut);
				_donut.z+=_count * 26;
				this._donutArray.push(_donut);
				this._count+=1;
				trace(this._donutArray);
			}
			else if (_count == 7)
			{
				_eat=true;
				trace(_eat);
				donut_eat();
			}
		}

		private function donut_eat():void
		{
			if (this._count > 0)
			{
				this._donut=this._donutArray.pop();
				this._count-=1;
				trace(this._donut);
				trace(this._count);
				this._baseNode.removeChild(_donut);
			}
			else if (this._count == 0)
			{
			  _eatCount++;
				//文字の設定
				_letterformat=new Letter3DMaterial(0xff0000, 1);

				//表示文字内容設定
				_textdata=new Text3D("完食"+_eatCount+"回目!", new CustomFont("完食"+_eatCount+"回目!", "_ゴシック", 75), _letterformat);
				_textdata.rotationX=90;
				_textdata.rotationZ=90;
				this._baseNode.addChild(_textdata);
				_eat=false;
			}
		}
	}
}


参加の皆さん、ありがとうございました&お疲れ様でした。次回は「こよみ」がLTのテーマだそうですよ。