note.x

PV3D2.0がベータ版に昇格だそうな。久々にアーカイブも配布されておりますな。
それにしてもFlashPlayer10の正式リリースまでに間に合うんだろうか…。

とはいえ、これでPV3D2.0の仕様は概ね固まったんじゃなかろうかと勝手に期待。すぐさまAstro向けに仕様変更が始まることがほぼ間違いないだけに、あんまり突っ込んで使ってみる気にならないけど。

08/08/27追記:
2.0Betaのクラスドキュメント出ましたな。
http://www.flashbookmarks.com/PV3D-Beta2-DOC/

放置してたけど、このblogで晒してるコードも動かなくなってそう。そのうち直します;

08/08/28追記:
いきなりバグに遭遇。
新しくなったCamera3D、fovを変化させても一向に見た目変わらんなーとか思ってたら、コンストラクタで fov 渡してないじゃんだってばよ。
※Rev.751で修正されたようです

Camera3D.asの

public function Camera3D(fov:Number=60, near:Number=10, far:Number=5000, useCulling:Boolean=false, useProjection:Boolean=false)
{
    super(near, 40);

    _prevFocus = 0;
    _prevZoom = 0;
    _prevOrtho = false;
    _prevUseProjection = false;
    _useCulling = useCulling;
    _useProjectionMatrix = useProjection;
    _far = far;
    _focusFix = Matrix3D.IDENTITY;
}

を、下記に書き換えた。

public function Camera3D(fov:Number=60, near:Number=10, far:Number=5000, useCulling:Boolean=false, useProjection:Boolean=false)
{
    super(near, 40);

    this.fov = fov;
    _prevFocus = 0;
    _prevZoom = 0;
    _prevOrtho = false;
    _prevUseProjection = false;
    _useCulling = useCulling;
    _useProjectionMatrix = useProjection;
    _far = far;
    _focusFix = Matrix3D.IDENTITY;
}

08/09/03追記:
PV3D2.0関係のエントリ、Beta1の仕様に合わせてザックリと更新。参考用に公開してるソースは問題なく動作するようになったと思う。
細かい部分を解説してる部分の検証が行き届いてないと思うので、オカシなところがあれば御指摘下さい。


Away3D2.1.5の新機能、Colladaのアニメーション・ボーン制御について整理。
いずれもBlender2.46にてColladaファイルを作成。

まずはアニメーションの制御。

walkMotion.swf(要:FlashPlayer9)

var loader:Object3DLoader;
loader = Collada.load('hoge.dae');
loader.addOnSuccess(loadComplete);
scene.addChild(loader);

- 中略 -

private function loadComplete(e:LoaderEvent):void
{
    model = (e.loader.handle as ObjectContainer3D);
    skinAnimation = (model.animationLibrary["default"] as AnimationData).animation as SkinAnimation;
}

モーション無しのColladaと同じ要領で読み込んだデータの animationLibrary プロパティから SkinAnimation オブジェクトを生成しておいてから、レンダーループ内とかで、

skinAnimation.update(getTimer()/1500);

と、updateメソッドを呼んでやればとりあえず動く。
引数は時間っぽい。SkinAnimationのloopプロパティがtrue(デフォルト値)なら、引数をひたすら増加させてやるだけで延々とアニメーションする。モーションを工夫して、いくつかの異なる動作を時間で区切れば多彩なアクションも可能かも。

これに関連した事柄で、ColladaにはAnimationChannelとかいう要素があって、複数のモーションデータを持たせることが仕様に含まれてるみたいなんだけど、その辺にも対応してるのかは不明。
正しくデータが作られてればColladaのモーション再生自体はエラく簡単。

問題なのはやっぱりBlenderからのColladaエクスポート。
今一つ確実に上手くいく方法が掴めないので、とッ散らかったメモを残しておく。

  • Y軸が上方向となるようにモデリング〜ボーン設定を行う
  • 書き出されたColladaファイルの要素を「Y_UP」にする
  • ルートボーンは1つにする
  • メッシュとペアレントした後自動設定されるモディファイアのArmatureをRealizeする
  • メッシュの各頂点が、必ずいずれかのVertexGroupに含まれるようにする
  • ボーンの名称に「.(ピリオド)」が含まれないようにする

特に座標系の違いが要注意部分。ColladaエクスポーターとAway3DのCollada.asでこの部分の連携が上手くいってない気がする。ガテン系ボーカロイドの腕が大変な動きをしてたのは、Z軸を上にして作ってたからだった。

次に直接ボーンを制御する場合。

boneControl(要:FlashPlayer9)
※画面左のつまみ系UIで腕と足の各軸の回転角度をイジれる。超使いにくい(えー)

読み込んだColladaがボーンを含んでいる場合、

var bone:Bone = model.getBoneByName("arm01_L");

//ボーンを各軸毎に回転
bone.jointRotationX(15);
bone.jointRotationY(5);
bone.jointRotationZ(10);

//ボーンを各軸毎に拡大縮小
bone.jointScaleX(0.5);
bone.jointScaleY(1.5);
bone.jointScaleZ(2);

って感じでアクセスできる。回転とスケールのみ制御可能。
普通にObject3Dを回転させたりするのと同じ要領ですな。IKとか設定したらどうなるのかは未調査。今度調べてみよう。

追記
現行のAway3D3.6では、ボーン制御のメソッドが、ゲッター/セッターに変更になってるので、以下のように。

var bone:Bone = model.getBoneByName("arm01_L");

//ボーンを各軸毎に回転
bone.jointRotationX = 15;
bone.jointRotationY = 5;
bone.jointRotationZ = 10;

//ボーンを各軸毎に拡大縮小
bone.jointScaleX = 0.5;
bone.jointScaleY = 1.5;
bone.jointScaleZ = 2;

全体的にPV3D + Blenderより全然まともに動く印象(最近のPV3Dがどうかはわかんないけど)Colladaのパースもやたら早いし。なかなかイイ感じなんじゃないでしょーか。


Curling Plane(要:FlashPlayer9)※ページをドラッグでめくれます。

前に試した lee felarca氏作の CurlingPlane.as をAway3Dに移植してみた。「とりあえず動くようにした」だけみたいなもんなので、バグ等あるかもですが興味のある方はどうぞ。

クラスファイルと簡易デモ(CurlingPlane.zip)

本家PV3D版のほうは、一枚のページ表現するのに背中合わせにした2枚のPlaneを使ったけど、Away3Dなら

var mat:WireColorMaterial = new WireColorMaterial(0x0099CC);
var bakmat:WireColorMaterial = new WireColorMaterial(0x00CCFF);
var obj:Plane = new Plane ( { material:mat, width:256, height:256, segmentsW:5, segmentsH:5} );
obj.bothsides = true;
obj.back = bakmat;

って感じで、 bothsidesプロパティで両面ポリゴンにしたものに backプロパティを組み合わせると表裏別のマテリアルが設定できる。これのおかげでわりと処理が省けるし、CurlingPlaneクラスも多少シンプルになった。


Away3D 2.1.5(Rev597)公開されました。svn経由で入手できます。
(7/31にコミットされたコードはCollada.asにバグがあるので、いち早く落とした方はアップデートすると吉。)

主なアップデート内容は

  • Colladaのボーン制御
  • scaleX, scaleY, scaleZ プロパティ追加
  • アニメーションライブラリの追加
  • away3d.core.geom パッケージの追加
  • primitives.Cubeに umin ,umax and vmin, vmax プロパティ追加

scale系プロパティの追加は地味にうれしい。けど、なんといっても目玉はColladaのボーン制御とアニメーション。katopzが超ガンバッてくれました。実はオレもチョットだけお手伝いしたので感慨深いッス。これでPV3Dに機能面で劣る部分はほとんど無くなった感じかな。

Colladaのアニメーション関係機能の使い方については、katopz本人がサンプルコードを公開してくれているので、興味がある方は参考にされるとよいかと。

オレも試しに、以前作ったデータを読み込んでみた…ら、腕の動きが大変なことに(笑)とりあえず笑えたので置いておく。

Collada Bone Animation Test – failed(要:FlashPlayer9)

ASCollada(DAE.as)より処理が軽い印象。ボーン制御のメソッドも動くし、何よりボーンが埋め込んであるオブジェクトを移動したり回転したりするのも難なく動いてかなり扱いやすい。マウスに反応する操り人形なんかは簡単に作れそうだわ。問題はやっぱBlenderのエクスポータだなぁ。とりあえずもうちょっと色々試してみて、バッドノウハウをため込もう。