[Away3D] AS3Dmod
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


[...] note.xさんの記事で萌えだったのがas3dmodライブラリを使用したぐにゅぐにゅしたシリンダー。PV3D 2.0 betaで試しに作ってみました。 [...]
[...] Away3D + AS3Dmod by note.x [...]
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?
> 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();
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