2007.05 Monthly archives

[Papervision3D] Peugeot206WRC #1

2007.05.30

PV3Dコアメンバーの一人、Carlos Ulloa氏がFocus好きみたいで、氏のサイトやPV3DのサンプルデータにもFocusが登場する。こういう具体的なモデルを制御するのはさぞ楽しかろうということで、Peugeotが好きなネコ科のオレは206WRC/1999(このカラーリングが一番好き)をチョイス。有り難いことにオープンソースのレースゲーム「TORCS」にモデルデータ+テクスチャが収録されてたので、このデータをBlenderでローポリ化、UVマップ貼り直してCollada出力してみた。

p206wrc.swf(要:Flash Player9)

うーん、UV貼りヘタっくそだなぁオレ…は修業するとして少なくともテクスチャだけは作り直したほうがよさそう。あとは更なるローポリ化と細かい調整か。こういうの作るとPV3DのZ-sortの問題が結構致命的に思えてくるなぁ…Away3D使ったほうがいいのかも。UVマップ貼りで疲れたので今回はここまで。Blenderで複数オブジェクトを結合せずにCollada出力する方法もようやくわかった。これで走らせられる。

Papervision3Dメモ #17

2007.05.25

AS2版PV3Dはどうなのか

実務レベルでPV3Dを使おうとした時に必要性が出てくるかもしれないと勝手に素振りして、AS2版だとどの程度までイケるのか実際ある程度触って調べてみた。つい最近リビジョンが上がったりして開発チーム的にはまだ切り捨てるつもりは無さそうだけど、結論としては「AS3版使っとけ」に尽きる。以下、致命的だと感じたオレ向けメモ。

劇的に重い

頂点数が増えると差が歴然。

DisplayObject3Dをツリー構造にできないっぽい

AS3版は

var rootNode:DisplayObject3D = new DisplayObject3D ( "rootNode" );
var planeObj1:Plane = new Plane (material, 100,100);
var planeObj2:Plane = new Plane (material, 100,100);
rootNode.addChild (planeObj);
rootNode.addChild (planeObj2);

みたいな感じで、親オブジェクトにaddChildすることでツリー構造になる。
この状態で

rootNode.rotationY += 1;

なんてことをすれば、rootNodeの原点を中心に2つのplaneObjをまとめてY軸回転できる。これが、AS2でも出来ると思ってたら出来なかった。不便なうえに、オブジェクトの個数分回転処理が必要になるからパフォーマンスにも影響が出る(んだよきっと)。

verticesを制御できないっぽい

AS3版は

planeObj.geometry.vertices[n].x = hoge;
planeObj.geometry.vertices[n].y = fuga;

で頂点の制御ができるが、これもAS2だとダメ。
形状データを定義する時点で設定した数値を後で変更できないので、
中心点をずらしたい時は、あらかじめ中心点をずらした状態で形状を定義する必要がある。

※たぶん上2つの問題をなんとかしたい時、AS2版ではColladaを使うのがセオリーっぽい。ただ、Blenderで複数オブジェクトを含んだデータをオブジェクト結合せずにCollada出力すると、なぜか1つしかオブジェクトが表示されない。オブジェクト結合した状態で出力すれば問題ないけど、今度は複数のオブジェクトを個別に動かすことができなくなる。3dsMAX買うしかねーのか!?(無理)

movexxx()、pitch()、roll()、yaw()、lookAt()など姿勢制御系のメソッドがごっそり無い

もうとにかくAS3版で便利に使ってたメソッドがほとんど無い。何をするにも苦労を強いられそう。

他にもY軸が下向きだったりとか出前のツケとかプロパン屋の支払いとかいろいろあるけど、AS3版なら簡単にできることをわざわざAS2版で技巧を駆使してまで使う意味無さげ。よほどの理由がない限りAS3の方向で。

[Papervision3D] ゾートロープ

2007.05.24

唐突にゾートロープを作ってみた。

zoetrope2.swf(要:Flash Player9)

操作方法:
[SPACE] Key 回転スタート/ストップ
[R] Key 視点位置をリセット
マウスプレス&ドラッグで視点を回転

できたできたヨ!と喜んでたんだけど、回転速度を調整してたらゾートロープの回転速度とフレームレートが同期すると、スリットから覗かなくても完全に動いて見えちゃうことに気がついた。当たり前っていえば当たり前なのかもしれないけど、オレ的にはなんだか大発見な気分だったので、スリット無しのバージョンも作ってみた。操作方法は上のと一緒。

zoetrope.swf(要:Flash Player9)

実物をシミュレートするなら、スリットから覗いているとき以外は回転方向に引き伸ばしたようなブラーかけたりしないとダメってことか。うーん、やっぱ実物のほうが不思議で楽しいな。

Away3Dにも手を出してみる

2007.05.16

PV3Dを拡張してテクスチャのパースペクティブ補正や、Z-buffer的実装したりしてたAlexander Zadorozhny氏による、PV3Dベースの3Dエンジン「Away3D」が公開されたので触ってみた。

関連リンク:
Alexander氏による驚愕のデモ
プロジェクトページ

とりあえず、PV3Dで一番やりたかったフォンシェードフラットシェードにトライ。

obj_Sphere.swf(要:Flashplayer9)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package
{
    import flash.display.*;
    import flash.events.*;    import away3d.cameras.*;
    import away3d.objects.*;
    import away3d.core.material.*;
    import away3d.core.scene.*;
    import away3d.core.render.*;
 
    [SWF(backgroundColor="0x000000")]
 
    public class obj_Sphere extends Sprite
    {
        public var view:View3D;
        public var sphere:Sphere;
        public var valx:Number = 0;
        public var valy:Number = 0;
 
        public function obj_Sphere()
        {
            stage.frameRate = 60;
            stage.quality   = "LOW";
            stage.scaleMode = "noScale";
            stage.align = StageAlign.TOP_LEFT;
            stage.addEventListener(Event.RESIZE, onStageResize);
            stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
 
            view = new View3D();
            view.x = stage.stageWidth  >> 1;
            view.y = stage.stageHeight >> 1;
            addChild(view);
 
            // カメラ設定
            view.camera.x = 0;
            view.camera.y = 0;
            view.camera.z = -300;
            view.camera.focus = 500;
            view.camera.zoom = 1;
 
            // ライト生成
            var light:Light3D = new Light3D();
            light.color = 0x006699;
            light.x = -350;
            light.y = 350;
            light.z = -350;
            view.scene.addChild(light);
 
            // Sphere生成
            sphere = new Sphere(
                {material:new ShadingColorMaterial ({ambient:0xFFFFFF,diffuse:0xFFFFFF,specular:0xFFFFFF}),
                radius:250,
                segmentsW:12,
                segmentsH:9,
                y:50}
            );
            view.scene.addChild(sphere);
            view.camera.lookAt(sphere.position);
        }
 
        private function onEnterFrame(event:Event):void
        {
            valx += view.mouseX >> 6;
            valy += view.mouseY >> 6;
            sphere.rotationY = valx;
            sphere.rotationX = valy;
            view.render();
        }
 
        private function onStageResize(event:Event):void
       {
            view.x = this.stage.stageWidth >> 1;
            view.y = this.stage.stageHeight >> 1;
        }
    }
}

本人によるサンプルコード以外に情報源が見つからず、頼みのコードが難解な構造だったんで単純化して解釈するのに一苦労。PV3Dとは全く別の物と考えたほうが良さげだろうし、個人的にはPV3Dのほうが扱い易いので、Away3Dの技術が取り込まれたRC2の登場を気長に待とう。

[Papervision3D] AS2版PV3DにCube.asを移植

2007.05.13

AS2版のPV3D用のプリミティブ生成クラスは、もともとパッケージに含まれるPlaneと、PV3D Wikiで公開されてるTim Knip氏提供のCylinder、Cone、Hemisphere、Sphere、Torusがあるんだけど、なぜかCubeが無い。
※PV3D Wiki、無くなっちゃったみたいです。

いまさらAS2版に需要があるとも思えないけど、個人的に必要だったんでAS3版のCube.asを移植した。

Cube.zip