3Dまわりのこととかを勉強してました。
で、この本を見ながら作ったのがこれです。
この本読んだことのない人のために解説しますと、1/3ぐらいを使って3Dの基礎を解説してくれています。以前に流し読みでさらっと見ただけだったんですが、もう一度1から書いてみようということで練習してました。
書いてみることで、スクリーンと焦点距離・zの関係と、スクリーンを中心とした座標というのがわかった気がします。
なんとなくわかったつもりだったときは、自分の視点を中心にまわってるように勘違いしてました。
で、話はとんで、wonderflの花火のすごいデモを解析しようとしたんですが、
→すごいデモ
このデモ、Player10の機能をかなり使ってるんですね。PerspectiveProjection, Matrix3D, Vector3D, Utils3Dなど。
Player10じゃないのも混じっているかも。それで、さっぱりわからん状態です。なので、もう少しこのPlayer10まわりの新機能やPV3dなんかも勉強しようと思っているところです。
とりあえず、drawTrianglesだ。ということで野中先生のこれを参考に作ってみました。
第二引数のところがわかりやすかったです。
ソースはこんな感じです。
package { import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.utils.getDefinitionByName; public class Main3 extends Sprite { public var points:Array; public var bmd:BitmapData; public var vertices:Vector.<Number> = new Vector.<Number>(); public var indices:Vector.<int> = new Vector.<int>(); public var uvtData:Vector.<Number> = new Vector.<Number>(); public var sp:Sprite; public var activeVertex:Sprite; public function Main3() { points = new Array(new Point(0,0), new Point(200, 0), new Point(200, 200), new Point(0, 200)); sp = new Sprite(); var Car:Class = getDefinitionByName("CAR") as Class; bmd = new Car(0, 0); indices.push(0, 1, 2); indices.push(0, 2, 3); uvtData.push(0, 0, 1, 0, 1, 1, 0, 1); this.addChild(sp); sp.x += 10; sp.y += 10; this.drawPoints(); this.setVertex(); } public function drawPoints(e:Event = null):void { if (activeVertex != null) { var no:int = parseInt(activeVertex.name.substr("vertex".length)); points[no].x = activeVertex.x; points[no].y = activeVertex.y; } vertices = new Vector.<Number>(); for (var i:int = 0; i < points.length; i++) { vertices.push(points[i].x, points[i].y); } sp.graphics.clear(); sp.graphics.beginBitmapFill(bmd); sp.graphics.drawTriangles(vertices, indices, uvtData); sp.graphics.endFill(); } public function setVertex():void { var i:int; for (i = 0; i < points.length; i++) { var vertexSP:Sprite = new Sprite(); this.addChild(vertexSP); vertexSP.x = this.points[i].x; vertexSP.y = this.points[i].y; vertexSP.graphics.beginFill(0xff0000, 1); vertexSP.graphics.drawCircle(10, 10, 10); vertexSP.graphics.endFill(); vertexSP.name = "vertex" + i.toString(); vertexSP.addEventListener(MouseEvent.MOUSE_DOWN, vertexDownHD); vertexSP.buttonMode = vertexSP.useHandCursor = true; } } public function vertexDownHD(e:MouseEvent):void { activeVertex = e.currentTarget as Sprite; activeVertex.startDrag(); var self:Main3 = this; this.stage.addEventListener(Event.ENTER_FRAME, this.drawPoints); this.stage.addEventListener(MouseEvent.MOUSE_UP, function(e:Event) { activeVertex.stopDrag(); self.stage.removeEventListener(Event.ENTER_FRAME, self.drawPoints); self.stage.removeEventListener(MouseEvent.MOUSE_UP, arguments.callee); self.drawPoints(); }); } } }
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ