円運動とFlickrと
この週末は移動時間がけっこうあったので、楽しくコーデイングしてました。
今回やってみたのは、
ほんで結果はこんなの。
PV3Dも雰囲気がわかってきたので、
これまでActionScript3.0アニメーションで習った知識を試してみました。
#sin、cosを使って円運動させてみただけ。
Flickr APIも初めて使ったけど、そんなに難しくなかったです。
api_keyをゲットすればあとはFlickrが返してくれるXMLを解析していけばOKでした。
ちなみにASにはFlickr用のライブラリもあるみたいだけど、まずは力技でやってみました。
ASはXMLと相性がいいから、ライブラリ使わなくてもどうにかなりました。
package { import flash.display.Bitmap; import flash.display.Loader; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; import flash.system.Security; import org.papervision3d.materials.BitmapMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; public class FlickrPlane extends BasicView { private var pictures:Array = []; public function FlickrPlane() { Security.loadPolicyFile("http://farm1.static.flickr.com/crossdomain.xml"); Security.loadPolicyFile("http://farm2.static.flickr.com/crossdomain.xml"); Security.loadPolicyFile("http://farm3.static.flickr.com/crossdomain.xml"); Security.loadPolicyFile("http://farm4.static.flickr.com/crossdomain.xml"); camera.y = 100; camera.z = -1500; // APIキーは公開しても良い? var req:URLRequest = new URLRequest("http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=自分のAPIキー&user_id=36325810@N02"); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, onComplete_loader); loader.load(req); startRendering(); } private var picCount:int = 0; private var currentPicNo:int = 0; private function onComplete_loader(evt:Event):void { var xml:XML = XML(evt.target.data); var xmlList:XMLList = xml.photos.photo; picCount = xmlList.length(); for each(var photo:XML in xmlList){ // この辺、てきとう。 var urlObj:Object = { farm:photo.@farm, server:photo.@server, id:photo.@id, secret:photo.@secret, create:function():String{ return "http://farm" + this.farm + ".static.flickr.com/" + this.server + "/" + this.id + "_" + this.secret + "_m.jpg" } } var url:String = urlObj.create(); var req:URLRequest = new URLRequest(url); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, photoLoad); loader.load(req); } } // 半径とか private var radius:Number = 500; private var centerX:Number = 0; private var centerY:Number = 0; private var centerZ:Number = 0; private function photoLoad(evt:Event):void { var bitmap:Bitmap = evt.target.content as Bitmap var bitmapMaterial:BitmapMaterial = new BitmapMaterial(bitmap.bitmapData); bitmapMaterial.doubleSided = true; var plane:Plane = new Plane(bitmapMaterial); // 初期配置 var angle:Number = 360 / picCount * currentPicNo * Math.PI / 180; currentPicNo++; plane.x = centerX + Math.cos(angle) * radius; plane.z = centerZ + Math.sin(angle) * radius; scene.addChild(plane); pictures.push(plane) } // 回転速度 private var vr:Number = 0.01; private var cos:Number = Math.cos(vr); private var sin:Number = Math.sin(vr); override protected function onRenderTick(event:Event = null):void { for(var i:int; i < pictures.length; i++){ var plane:Plane = pictures[i]; var x1:Number = plane.x - centerX; var z1:Number = plane.z - centerZ; var x2:Number = cos * x1 - sin * z1; var z2:Number = cos * z1 + sin * x1; plane.x = centerX + x2; plane.z = centerZ + z2; } super.onRenderTick(event); } } }
週末プログラミングはたのしい。