2008.05 Monthly archives

[Astro] Vector3D / Matrix3D で座標変換

2008.05.21

astro_test.swf(要:FlashPlayer10 beta)

Astro触ってみた。好評現実逃避中。
Targeting Flash Player 10 Beta with Flex SDK 3.0.x – Adobe Open Sourceを参照しつつFlashPlayer10向け環境をセットアップ。SDKはBuild 3.0.1.1739 を使った。

Sprite、MovieClipで使える3DEffect(.z とか、rotationX,Y,Z とか)って、flash.geom.Transform 使った変形をお手軽に使えるようにしたものっていう解釈でいいのかな? 簡単だし軽いんで、ちょっと3Dっぽくしたい時はこれで充分かと。
んで、もうちょっとマジメに3Dしたい場合はやっぱり頂点シェーダー的なものを実装しなくちゃならないわけで、その辺に挑戦してみたのが上記のデモ。
キモになる部分をまとめたソースが以下。

※09/01/10 コードを若干修正

package
{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
 
    [SWF(backgroundColor="#000000")]
 
    public class astro_sample extends Sprite
    {
        private var view:Sprite;
        private var fov:PerspectiveProjection = new PerspectiveProjection();
        private var vertex:Vector.<Vector3D>;
        private var deg:Number = 0;
        private var dot:Vector.<Sprite> = new Vector.<Sprite>();
        private var pivot:Vector3D = new Vector3D(0,0,0);
        private var wid:Number = 200;
        private var hei:Number = 200;
        private var dep:Number = 200;
 
        public function astro_sample()
        {
            stage.frameRate = 60;
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.BEST;
 
            init3D();
        }
 
        private function init3D():void
        {
            view = new Sprite();
            addChild(view);
            view.x = stage.stageWidth >> 1;
            view.y = stage.stageHeight >> 1;
            view.z = 0;
 
            //視野角の設定
            fov.fieldOfView = 55;
 
            //頂点の定義
            vertex = Vector.<Vector3D>
            ([
                new Vector3D(-wid/2, +hei/2, -dep/2),
                new Vector3D(+wid/2, +hei/2, -dep/2),
                new Vector3D(+wid/2, -hei/2, -dep/2),
                new Vector3D(-wid/2, -hei/2, -dep/2),
                new Vector3D(-wid/2, +hei/2, +dep/2),
                new Vector3D(+wid/2, +hei/2, +dep/2),
                new Vector3D(+wid/2, -hei/2, +dep/2),
                new Vector3D(-wid/2, -hei/2, +dep/2)
            ]);
 
            //表示オブジェクト定義
            for (var i:int = 0; i < 8; i++)
            {
                var s:Sprite = new Sprite();
                view.addChild(s);
                s.graphics.beginFill(0x0099CC);
                s.graphics.drawCircle(0, 0, 5);
                s.graphics.endFill();
                dot.push(s);
            }
 
            stage.addEventListener(Event.RESIZE, onStageResize);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
 
        //Render Loop
        private function onEnterFrame(event:Event):void
        {
            //回転角度を増加
            deg++;
 
            var matrix:Matrix3D = new Matrix3D();
            //回転行列生成
            matrix.appendRotation(deg, Vector3D.Y_AXIS, pivot);
            matrix.appendRotation(deg, Vector3D.Z_AXIS, pivot);
 
            var vs:int = vertex.length;
            for(var i:int = 0; i < vs; i++ )
            {
                //座標変換
                var v:Vector3D = matrix.transformVector(vertex[i]);
                v.w = fov.focalLength / (fov.focalLength + v.z);
                v.project();
 
                //表示オブジェクト座標に割り当て
                dot[i].x = v.x;
                dot[i].y = v.y;
            }
        }
 
        private function onStageResize(event:Event):void
        {
            view.x = stage.stageWidth >> 1;
            view.y = stage.stageHeight >> 1;
        }
 
    }
}

下記の記事が大いに参考になりました。

地味で実装が辛いコアクラスが一通りビルトインされてるってのはスゲェ。
Vector3DとMatrix3DとPerspectiveProjectionクラスだけでそれっぽいものが出来た。やっててよかったPV3D。
PV3DやSandyをはじめとする既存3Dエンジンは、このへんのコアクラスを全部入れ替えて、Arrayの代わりにVectorは積極的に使いつつ、drawTrianglesで描画するように変更するだけでかなり高速化されるんじゃないのかなぁ。パースペクティブコレクトのおまけ付きだし。

Flash Player 10 beta

2008.05.17

出ましたな。

すでに、3D Effectsのデモが。仕事早いなぁ。

ざっくり見た感じ、FIVe3Dがビルトインになったような印象を受けた。
ビルボード表現とか、パーティクルっぽい感じとか、簡易的に3D表現を演出に取り入れるならこれで充分だなぁ。
逆に、モデリングしたデータを読み込んで〜とか言い出し始めると、結局かなり作り込んだラッパークラス群が必要になるんじゃねーかと(そんな需要があるとも思えないけど)。Z-Sortも自前でやらなきゃならないみたいだし、ビルトインのTween機能に対してTweenerがあるように、3D Effectsの使い勝手を向上させるライブラリが登場するんでしょうな。

去年情報公開されてからというもの、3D Effects と Enhanced Drawing APIでPV3D涙目とか囁かれてたけど、むしろこれで既存の3Dライブラリが高速化されたらうれしげ。特にPixel Benderを利用してGPUの恩恵を得られれば相当無茶なことが出来そうな気がするので超楽しみ。

全然関係無いけど、Google Maps API for Flashが公開されたりとか、Flash界隈が面白そうな事でいっぱいなのに、仕事も目一杯でちっとも遊べない。早く終わらせて遊びてぇー!

追記:
alternativaplatform(旧alternativagames)のAnton Volkov氏にいただいたSPコメント(笑)によると、Alternativa3Dが早くもAstro対応したらしい。対応迅速すぎ。んで、対応版を見た感じやっぱ早くなってる。
どっちのデモも始めに低解像度のテクスチャで表示されて、順次高解像度のテクスチャに入れ替わる(かなり時間かかる)のはAstro対応前と同じなんだけど、(全部高解像度テクスチャになった状態はかなりヤバい)Astro版は、これにパースペクティブコレクトが完璧にキまる。重い処理だと思うんだけどパフォーマンスが維持されてるなぁ。この辺がAstro様の御加護なのかしら?さらにチューニングされたらどうなっちゃうんだろ。

早くAlternativa3Dのswc配布を始めて欲しいッス。

action-coding超楽しそう

2008.05.13

action-coding – Google Code
http://code.google.com/p/action-coding/

Proce55ing + Ruby + TextMate っていう、スクリーンキャスト見る限りRubiest向けNodeBoxって感じ。P5をAPIとして使ってるあたりが超ステキだなぁ、VJネタとかパカパカ作れそうですな。

サーバーサイドっぽいもの作って勉強するスタイルはPerlとPHPで疲れちゃったんで、RoRとか「う〜ん」だった。これならRubyを勉強してみる気になるかも。ただ、相当深いとこまで使い込まないと実際のコンテンツ開発環境としてのメリットは見えてこなそう。QuartzComposerでも作れちゃう程度の習熟度じゃ、action-codingのポテンシャルに負ける。

PythonベースのNodeBoxも面白いし、このへんの選択肢が増えたのはウレシイ。
まぁ、あれこれ手を出して散漫になるのはいけないと思うんで、まずはAS3.0でマトモにコンテンツ作れ>オレ
と言いつつきっと手を出すぞ>オレ
自重せよ>オレ

[Away3D] Tunnel

2008.05.08

tunnel.swf(要:FlashPlayer9)

メガデモなんかでは、さんざんやり尽くされた感のあるトンネル作ってみた。

同じメッシュ構成の2つのCylinderを用意して、それぞれ別の姿勢に頂点を変換しておいて、各頂点の座標をあらかじめ設定した頂点ごとのウェイト値にしたがってブレンドする「Vertex.weighted()」ってメソッド使ってトンネルをウネウネさせてるんだけど、このウェイトの調整がアマくて、かなりビミョーな挙動になっておりますな。

Vertex.weighted()メソッドでハマったのがnamespace。Away3Dは、「arcane」っていうネームスペースが定義されてて、いくつかのメソッドがこのネームスペース内に閉じこめられてる。Vertex.weighted()もその一つ。なので、

import away3d.core.arcane;
・
・
public class hoge
{
    use namespace arcane;
・
・

って感じで、away3d.core.arcaneをインポートした上でuse namespace宣言しないと使えない。この辺の話は「BeInteractive! [Namespace]」がスバラシく参考になりました。

テクスチャのほうはTransformBitmapMaterialで、タイリングもスクロールも出来ちゃった。PV3Dだと結構メンドイのがウソのような激しい便利さであります。Bitmap系マテリアルは、precisionプロパティの設定でパースペクティブコレクトが使えるんだけど、今回のケースだと重かったんで未使用。おかげで歪む歪む。

ともあれ、ウネウネ具合をウツクシくしたいのと、もっと軽くしたいなぁ。
もっと調整すれ!>オレ

[Away3D] Rubikscube

2008.05.07

ここまでのまとめの意味で、PV3Dでも作ったルービックキューブをAway3Dでも作ってみた。Number3D、Matrix3Dクラスの仕様など、基本が一緒だから全く同じに作れた。PV3D版との違いは無駄にクォータニオンを使ってみたこと。

RCubeAway3D.swf(要:FlashPlayer9)

ほぼ同じに作ったつもりなんだけど、PV3D版より軽い気がする。ポイントライトを2つ設置して色付けしたりしてるのに体感速度がPV3Dを上回ってる感じなので気のせいじゃなさそう。Away3DのほうがMatrix3Dの処理がシンプルなのでその辺で差がでてるのかなぁ。