[Away3D] AS3Dmod

2008.09.09

AS3Dmod Test(要:FlashPlayer9)

AS3Dmod なんてのがあったので使ってみた。
PV3D、Away3D、Sandy、Alternativa3Dと、AS3用の主要な3Dエンジンに対応したモディファイアライブラリ。何故か「物理エンジン」とか「クロスシミュレーション」とかいう解釈で紹介されてたりするけど、物理演算ではなくて単純に頂点を制御してメッシュを変形させるもの。やってることはこれと同じ。物理エンジンじゃないんだぜ。

今のトコ、Bend、Noise、Perlin と、3つのモディファイアが実装されてる。上記サンプルだと Cylinder に Bend、Plane に Perlin、GeodesicSphere に Noise をそれぞれ適用してみた。これに zupko.info の Twistあたりを追加で移植すれば即席メガデモもどきが作れそうな感じ。とはいえ、ミエミエな使い方は実務だとイタいな。

配布されてるアーカイブ付属のサンプルが結構ややこしかったんで単純にしてみた。Away3D用。

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package
{
    import flash.display.*;
    import flash.events.*;
 
    import away3d.containers.View3D;
    import away3d.core.base.*;
    import away3d.containers.ObjectContainer3D;
    import away3d.cameras.TargetCamera3D;
    import away3d.primitives.*;
    import away3d.materials.*;
 
    import com.as3dmod.modifiers.*;
    import com.as3dmod.util.*;
    import com.as3dmod.ModifierStack;
    import com.as3dmod.plugins.away3d.LibraryAway3d;
 
    [SWF(backgroundColor="#FFFFFF")]
 
    public class as3dmodSample extends View3D
    {
        private var mod:ModifierStack;
        private var ben:Bend;
        private var benPhase:Phase;
 
        private var mod2:ModifierStack;
        private var noi:Noise;
 
        private var mod3:ModifierStack;
        private var per:Perlin;
 
        public function as3dmodSample()
        {
            stage.frameRate = 60;
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.MEDIUM;
 
            //View3D init
            var targetCamera:TargetCamera3D = new TargetCamera3D();
            super({camera:targetCamera, x:stage.stageWidth/2, y:stage.stageHeight/2});
            init();
        }
 
        private function init():void
        {
            initAway3D();
            initObjects();
            initListeners();
        }
 
        private function initAway3D():void
        {
            //Camera Setting
            camera.y = 2000;
            camera.x = 1000;
            camera.z = 5200;
            camera.focus = 500;
            camera.zoom = 12;
        }
 
 
        private function initObjects():void
        {
            // Material Setting
            var wcMat:WireColorMaterial = new WireColorMaterial(0x0099CC, {wirecolor:0x00CCFF});
 
            // Object Setting
            var cylinder:Cylinder = new Cylinder({material:wcMat, radius:35, segmentsW:8, segmentsH:6, height:400});
            scene.addChild(cylinder);
            cylinder.x = -200;
            cylinder.z = 200
 
            var objPlane:Plane = new Plane({material:wcMat, width:300, height:300, segmentsW:6, segmentsH:6 });
            objPlane.bothsides = true;
            scene.addChild(objPlane);
            objPlane.x = 200;
            objPlane.z = 200;
 
            var geo:GeodesicSphere = new GeodesicSphere({material:wcMat, radius:60, fractures:2});
            scene.addChild(geo);
            geo.x = 0;
            geo.z = -200;
 
            // Modifier Setting
            mod = new ModifierStack(new LibraryAway3d(), cylinder);
            ben = new Bend(0, .3);
            ben.constraint = ModConstant.LEFT;
            benPhase = new Phase();
            mod.addModifier(ben);
 
            mod2 = new ModifierStack(new LibraryAway3d(), geo);
            noi = new Noise(8);
            mod2.addModifier(noi);
 
            mod3 = new ModifierStack(new LibraryAway3d(), objPlane);
            per = new Perlin(1);
            per.setFalloff(0.5, 0.5);
            mod3.addModifier(per);
        }
 
        //Render Loop
        private function loop3D(event:Event):void
        {
            benPhase.value += 0.05;
            ben.force = benPhase.phasedValue;
            mod.apply();
            mod2.apply();
            mod3.apply();
 
            //Rendering
            render();
        }
 
 
        private function initListeners():void
        {
            addEventListener(Event.ENTER_FRAME, loop3D);
            stage.addEventListener(Event.RESIZE, onStageResize);
        }
 
        private function onStageResize(event:Event):void
        {
            this.x = stage.stageWidth >> 1;
            this.y = stage.stageHeight >> 1;
        }
 
    }
}

実際にコンパイルする場合は、そのままだとエラーになるので次のような対処を。
※最近のリビジョンではこの問題が解決されております。

Arthropod で採用されてる com.carlcalderon.arthropod.Debug クラスが無いとエラーになるので、該当クラスをパスの通った場所に設置するか、

import com.carlcalderon.arthropod.Debug;

の行をコメントアウト。下記ファイルに該当箇所がある。

  • core/MeshProxy.as
  • modifiers/Bend.as
  • modifiers/Noise.as
  • modifiers/Perlin.as
  • plugins/alternativa3d/Alternativa3dMesh.as
  • plugins/away3d/Away3dVertex.as

あと、modifiers/Noise.as には

import alternativa.types.Matrix3D;

って部分があって、ここもコメントアウトした。Alternativa3D入れてないので。
そんな感じでコンパイルが通るようになると思うです。

08/09/22追記:
モディファイアが追加されてた。
追加になったのは Taper、Skew、Twist、Bloat の4つ。

AS3Dmod 追加モディファイア(要:FlashPlayer9)

Taper、TwistなんかはLightWaveで使ってた機能とほぼ一緒なのでなじみ深いですな。Skewは一見Bendと似てるけど、こっちはいわゆる「せん断」なのでちょっと違う。Bloat面白いな〜、膨らませる中心点をx, y, z座標で指定できるので「カーペットの下に潜り込んだジェリー」とか「雨どいの中を通過中のジェリー」っぽい表現(何)とかできそう。

関連する投稿

Trackback URL : http://blog.r3c7.net/wp-trackback.php?p=224

コメント / トラックバック5件

  1. [...] note.xさんの記事で萌えだったのがas3dmodライブラリを使用したぐにゅぐにゅしたシリンダー。PV3D 2.0 betaで試しに作ってみました。 [...]

  2. Owen より:

    hi, i am using away3d too.
    i want to ask about taper function. how can u taper a mesh along y axis?
    When i using taper a mesh, as3mod will taper mesh along x axis.

    or can u send me the code of 08/09/22追記 demo?

  3. rect より:

    > Owen

    mod = new ModifierStack( new LibraryAway3d(), Object3D );
    tap = new Taper(2);
    tap.setFalloff(0.1, 0.7);
    tap.power = 0.9;
    mod.addModifier(tap);
    tapPhase = new Phase();

    //render loop
    tapPhase.value += 0.05;
    tap.force = tapPhase.phasedValue + 0.5;
    mod.apply();

  4. ge5 より:

    Hi- can u send me the code of 08/09/22追記 demo? or any info for using “bloat” modifier?
    thank you very much.
    ge5@nyu.edu

コメントをどうぞ

Powered by WP Hashcash