っぽいものを作ってみたw
ちょっとショートコーディングしてみようと思ってがんばった
なんかずるいとこもあるかもしれないけど、一応15行
もうちょっと短くなる?
前回はDisplayObjectクラスのプロパティをちょこっといじっただけだったので、
今回はPerspectiveProjectionクラスをいじってみます
PerspectiveProjectionクラスってのは遠近法を簡単に適応するクラスらしい
このクラスのプロパティは3つ
・fieldOfView
Number
0 < fieldOfView < 180
遠近法による変形と歪みの強さを決めるプロパティ
値を大きくすると魚眼レンズみたいになる
・focalLength
Number
焦点距離を表すプロパティ
視点の原点(0,0,0)とz軸上のオブジェクトとの間の距離を表す
値が大きいと望遠鏡のように、小さいと魚眼レンズのようになる
・projectionCenter
Point
遠近法の消失点を表すプロパティ
fieldOfViewとfocalLengthは互いに依存してるので片方変更するともう片方も変更するらしい
fieldOfViewを変更したときのfocalLengthは次の式で計算される
focalLength = stageWidth/2 * (cos(fieldOfView/2) / sin(fieldOfView/2)
デフォルトでは次の値になる
• fieldOfView:55
• perspectiveCenter:stagewidth/2, stageHeight/2
• focalLength:stageWidth/ 2 * ( cos(fieldOfView/2) / sin(fieldOfView/2) )
とりあえずPerspectiveProjectionを使ってなんか作ってみる
wonderflのほうが公開するの楽なんでwonderflに書きますw
長細い線みたいなのがビュンビュン飛んでるけど、実は正方形
PerspectiveProjectionのfieldOfViewの値を大きくして魚眼レンズのようにしている
projectionCenterは常にマウスの座標になるようにしている
これだけでおもしろくなるもんだなぁ
次はMatrix3Dを使ってみる
せっかくFP10で3Dの概念が追加されたんだから3Dやってみようってことで
FP10で追加された3Dの機能
・flash.display.DisplayObject クラス
z プロパティやscaleZ
rotationX,rotationY,rotationZなどの各軸の回転角
3次元座標を2次元に変換するlocal3DToGlobal() メソッド が追加された
・flash.geom.Vector3D クラス
3次元座標を格納するクラス
回転角も入れたりできる
※Vectorクラスとは違います Vectorクラスはすべてのエレメントが同じデータ型を持つ配列で、Vector3Dクラスは3次元空間のベクトルを表すクラスです
・flash.geom.Matrix3D クラス
回転、拡大、縮小、平行移動などの3Dの変換を行うクラス
・flash.geom.PerspectiveProjection クラス
遠近法に基づく変形を行うクラス
とりあえずくるくる回転するだけの物を作ってみた
package {
import flash.display.Sprite;
import flash.events.Event;
public class Study3d1 extends Sprite {
private const SIZE:int = 100;
private const W:int = stage.stageWidth;
private const H:int = stage.stageHeight;
private var mc:Sprite;
public function Study3d1():void {
mc = new Sprite();
mc.graphics.beginFill(0x0077ff);
mc.graphics.drawRect(-SIZE/2, -SIZE/2, SIZE, SIZE);
mc.graphics.endFill();
mc.x = W / 2;
mc.y = H / 2;
addChild(mc);
addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
private function onEnterFrameHandler(e:Event):void {
mc.rotationX = H / 2 - mouseY;
mc.rotationY = W / 2 - mouseX;
}
}
}
おー回ってる回ってる
次はもちっと複雑な動きをする物を作ってみたいと思います
The 25-Line ActionScript Contest
これすごい
25行でこんなことができるのか!
ショートコーディングには興味あるけど読みにくいのはちょっとつらいw
ちょっとした思いつきでJanuary 2009 Finalists! Entry001のコードをちょっとばかし改造
マトリックスっぽくしてみた
ちなみにwebカメラがないと動かないので持ってない人は3秒で買ってきてください
グローフィルターなし
グローフィルターあり
やっぱグローフィルターありのほうがマトリックスっぽい?
重いのが欠点
25行でなんか作ってみたいなー
アイディアがまったく思い浮かばない
あと、ブログのタイトルにタグをつけるのをやめた。理由はめんどくさいから。
某掲示板でVecoterに適当なオブジェクト型を突っ込んだときの動きがおかしいというのがあったので検証してみた
FlexSDKのバージョンは3.2.0.3958 と 3.2.0.4537
wonderflのFlexSDKバージョンはVersion 3.2.0 build 3794 と書いてある
ついでにwonderflのブログパーツを貼ってみるテスト
(ブログパーツが更新されてflash自体が表示されるようになったけど、今度はソースを載せたい場合はどうすればいいんだろう・・・w)
ソースはブログパーツから飛んでいけば見られます
int、Number型以外は一回目のunshift以降配列の長さが変わってない
でも一つだけある要素の番号が4になっているので最後にunshiftしたものが入っていることになる
上書きしてる?
ためしにもう一つ書いてみた
pushするとちゃんと入っている
その後unshiftするとちゃんと先頭に入って以降ひとつずつずれている
が、配列の長さが変わってないため最後の要素が切り捨てられている
仕様・・・?なわけないな、数値はちゃんとunshiftされてるんだし
バグ報告がすでにされていた
http://bugs.adobe.com/jira/browse/ASC-3620
Created: 06/20/08 02:59 PM・・・・?
こんなバグずっと放置しとくもんなの?