2007.08 Monthly archives

Papervision3Dメモ #27

2007.08.29

particlesの件

Rev.228でparticlesオブジェクトが追加された。AbstractParticleを継承していろんなパーティクルが作れそう。今後はStarParticleを使った「ParticleField」が「Stars」の代替オブジェクトになるみたいなので試してみつつ、Starsとの速度比較をしてみた。ビルドに用いたのはいずれもPV3D Beta 1.7(Rev.231)。表示されるパーティクルの数は揃えたつもり。

obj_Stars_fps.swf … Starsを使ったもの
obj_PF_fps.swf … ParticleFieldを使ったもの
(要:FlashPlayer9)

お〜速いじゃん。ParticleFieldはともかく、パーティクルが使えるようになったのは面白いかも。Away3Dにはパーティクル実装してなかった気がするし、独自性が出て良さげ。
ParticleFieldの使い方はStarsとほぼ同じ。色の指定がColorMaterialから直接RGB値になったくらい。

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
76
77
package {
 
    import flash.display.*;
    import flash.events.*;
 
    import org.papervision3d.scenes.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.particles.*;
 
    [SWF(backgroundColor = 0x000000)]
 
    public class obj_PF extends Sprite {
 
        // プロパティ
        private var container   : Sprite;
        private var scene       : MovieScene3D;
        private var camera      : FreeCamera3D;
        private var objPF       : ParticleField;
        private var valx        : Number = 0;
        private var valy        : Number = 0;
 
        // コンストラクタ
        public function obj_PF():void
        {
            stage.frameRate = 60;
            stage.quality   = StageQuality.MEDIUM;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align     = StageAlign.TOP_LEFT;
            addEventListener(Event.ENTER_FRAME, loop3D);
            stage.addEventListener(Event.RESIZE, onStageResize);
 
            init3D();
        }
 
        // 初期化
        private function init3D():void
        {
            // コンテナ生成
            container = new Sprite();
            addChild(container);
            container.x = stage.stageWidth  / 2;
            container.y = stage.stageHeight / 2;
 
            // シーン生成
            scene = new MovieScene3D( container );
 
            // カメラ生成
            camera = new FreeCamera3D();
            camera.z = 0;
            camera.focus = 500;
            camera.zoom = 1;
 
            // ParticleField生成
            var starSprite:Sprite = new Sprite();
            objPF = new ParticleField(900, 0xffffff, starSprite, 1000, 1000, 1000 );
            scene.addChild( objPF );
        }
 
        // EnterFrame
        private function loop3D( event:Event ):void
        {
            valx += container.mouseX / 50;
            valy += container.mouseY / 50;
            objPF.rotationY = valx;
            objPF.rotationX = valy;
            scene.renderCamera( camera );
        }
 
        private function onStageResize(event:Event):void
        {
            container.x = stage.stageWidth  / 2;
            container.y = stage.stageHeight / 2;
        }
 
    }
}

07/11/13追記
カメラが原点に配置してあるとFlashPlayerのリビジョンによって問題が発生することが判明したため、上記のswfとソースを修正しました。詳細については「[Papervision3D] 原点にカメラがあるとフリーズする件」にて。

Papervision3D + APE = ヨーヨー

2007.08.28

「こ、これだって、PV3DとAPEの連携なんだからねっ!」

e_apepv3d_test.jpg

ApePV3D_Test.swf(要:FlashPlayer9)

AbstractItemのspriteをsceneにしてSphereをaddChildしただけ。っていうか日本語喋れっていうか。発端はVOO-DOO-DOLLSにPV3Dのオブジェクトぶら下げようとしたんだけど、出来なくって自力でやってみた。苦労したわりにあんまり面白いものにはならなかった(泣)かわいいキャラクタぶら下げたほうがよっぽど和む。

頂点をAPEで動かすとなると大変そうだ。wow-engineって開発中止になっちゃったのかなぁ?

APE(Actionscript Physics Engine)も触ってみる

2007.08.27

来るべきPhysics時代(何)に備えてAPE(Actionscript Physics Engine)を触ってみる。とりあえず、パーティクル掴んでポイポイできるようにしてみた。もっと簡単にできると思ってたら結構めんどうだった。付属のデモにはマウスイベント絡めたものが無くて、GoogleGroup – APE Generalの「Tunnelling Problem w/ Interactivity」が参考になった。

e_apestudy.jpg

Ape_study.swf(要:FlashPlayer9)

なんか挙動がおかしいのを何とかしたいのと、もうちょっと軽くしたいところ。

Papervision3Dメモ #26

2007.08.24

PV3Dの座標系について

PV3Dのチートシートにワールド座標系の解説図が載ってて、これによると画面手前側が「+Z」奥側が「-Z」という、いわゆる「右手座標系」ってことになってる。確か公式にも「right-handed coordinate system」みたいな記述がされていたのを見た記憶がある。

これまで作った自分のデモのソースを見ると「camera.z = -500」ってな記述がほとんど。これは、PV3Dのサンプルコードの中でcameraオブジェクトの座標指定を「camera.z = -500」とかやってるものが多かったんで、何の疑いもなく「カメラの位置を画面手前側に移動してる」と思って、それに倣ってきたんだけどPV3Dが右手座標系ならこの解釈はおかしいということになる。今更すぎるけどPV3Dの座標系がどうなってんのか調べてみた。

worldAxis.swf(要:FlashPlayer9)

cameraオブジェクトは「X:0,Y:0,Z:-800」の位置に置いた。この状態でobjCubeの動きと数値を見て、一般的な右手座標系の場合と比較してみると、Z軸の正方向とY軸の回転方向が一般的な右手座標系とは逆になってる。

※矢印の向きが正方向

これって何系よ?こういうのも右手座標系って呼ぶんだろうか。
Face3Dを定義する場合に半時計周りに頂点を登録しないと裏向きになるので、このあたりは右手座標系っぽいんだけど、左と右が混在してる感じでなんか混乱するぞ。調査方法がおかしいのかなぁ。

Papervision3Dメモ #25

2007.08.21

Update Version 1.7(Rev 200)

svnリポジトリにて、PV3D Version 1.7(Rev 200)が公開。

  • MovieAssetMaterialのバグフィックス
  • FaceLevelInteractivityブランチのマージ
  • docs(クラスドキュメント)の更新
  • ISMのドラッグ処理(VirtualMouse経由でのclick/drag、press/releaseメソッドが利用可能に)

が、主な更新内容みたい。

個人的には、この更新のすぐ直後にコミットされた「PreciseBitmapMaterial」のほうがインパクトがデカかった。これはパースペクティブコレクト付きBitmapMaterialで、Away3Dのアルゴリズムが採用されたもの。キター!と思ってすぐに試してみたけど上手く動かない。バグ?それともFlex2SDKじゃダメなのかなぁ?あと、FaceLevelInteractivityがマージされたってんで、昨日のデモをコンパイルし直したら挙動がおかしくなった。ちょっと様子見てみよう。

追記
PreciseBitmapMaterial、色々いじってるうちに動いた。

Precise_Bitmap.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
76
77
78
79
80
81
82
83
84
85
package {
 
    import flash.display.*;
    import flash.events.*;
 
    import org.papervision3d.core.*;
    import org.papervision3d.scenes.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.materials.*;
 
    [SWF(backgroundColor = 0x000000)]
 
    public class Precise_Bitmap extends Sprite {
 
        [Embed(source='e_check.jpg')] public var Image:Class;
 
        // プロパティ
        private var container   : Sprite;
        private var scene       : Scene3D;
        private var camera      : Camera3D;
        private var rootNode    : DisplayObject3D;
        private var valx        : Number = 0;
        private var valy        : Number = 0;
 
        // コンストラクタ
        public function Precise_Bitmap():void
        {
            stage.frameRate = 60;
            stage.quality   = "LOW";
            stage.scaleMode = "noScale";
            stage.align = StageAlign.TOP_LEFT;
            this.addEventListener(Event.ENTER_FRAME, loop3D);
            init3D();
        }
 
        // 初期化
        private function init3D():void
        {
            // コンテナ生成
            container = new Sprite();
            addChild(container);
            container.x = stage.stageWidth  / 2;
            container.y = stage.stageHeight / 2;
            stage.addEventListener(Event.RESIZE, onStageResize);
 
            // シーン生成
            scene = new Scene3D( container );
 
            // カメラ生成
            camera = new Camera3D(null,6,100,{x:0,y:0,z:-1500});
 
            // rootNode生成
            rootNode = scene.addChild( new DisplayObject3D( "rootNode" ) );
 
            // Material生成
            var texture:BitmapData = new Image().bitmapData;
            var pbMaterial:PreciseBitmapMaterial = new PreciseBitmapMaterial( texture );
            var nmMaterial:BitmapMaterial = new BitmapMaterial( texture );
 
            // Cube生成
            var obj_Cube1:OldCube = new OldCube(pbMaterial, 500, 500, 500, 1, 1, 1,{x:-400});
            rootNode.addChild( obj_Cube1 );
            var obj_Cube2:OldCube = new OldCube(nmMaterial, 500, 500, 500, 1, 1, 1,{x:400});
            rootNode.addChild( obj_Cube2 );
        }
 
        // EnterFrame
        private function loop3D( event:Event ):void
        {
            valx += container.mouseX / 50;
            valy += container.mouseY / 50;
            rootNode.rotationY = valx;
            rootNode.rotationX = valy;
            scene.renderCamera( camera );
        }
 
        private function onStageResize(event:Event):void
        {
            container.x = stage.stageWidth  / 2;
            container.y = stage.stageHeight / 2;
        }
 
    }
}

比較のために、2つのCubeのうち片方にはBitmapMaterialを適用した。これまで、テクスチャが歪まないようにするにはポリゴンの分割数を上げるしかなかったけど、これで解決できそう。ただ、デモ作ってて気になったのが、カメラとオブジェクトの距離、カメラのfocusとzoomの値の組み合わせできちんと動かない場合があるような感じだった。いまいち法則性が掴めなかったんだけど、このマテリアル使うときはそのへんに注意かも。