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のテーマだそうですよ。