
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座標で指定できるので「カーペットの下に潜り込んだジェリー」とか「雨どいの中を通過中のジェリー」っぽい表現(何)とかできそう。