Home > Library
Library Archive
[as3][FOAM]初めてのFOAM(2) 多角形の表示
- 2008-02-12 (Tue)
- ActionScript3.0 | Library
前回記事 初めてのFOAMの続きです。
今回は多角形の表示をします。
FOAMの基本的な使い方は前回の記事を参考にしてください。
var rigid:RigidBody = new RigidBody([X位置], [Y位置], [サイズ], [頂点の座標配列]); foam.addElement(rigid);
これが多角形を表示するコードです。
メソッドの引数はほかにもあるのでいろいろ調節はできるようですが、
まだ調査不足のためそのあたりはいずれ・・・。
今回のサンプルでのコードとしてはこのように書いています。
// 座標をランダムに決定。0-300で。(今回はswfのサイズが300×300なので) var rnd_x:Number = Math.random() * 300; var rnd_y:Number = Math.random() * 300; // 多角形のサイズをランダムに決定。20-60。この数値は適当。 var rnd_size:Number = 20 + Math.random() * 40; // 頂点数をランダムに決定。2-9。頂点数2なら直線、3なら三角形に。 var rnd_num_vertices:Number = 1 + Math.ceil(Math.random() * 8); // createSymmetricPolygonメソッドで頂点座標の配列を返す。 var rigid_arr:Array = ShapeUtil.createSymmetricPolygon(rnd_num_vertices, rnd_size); // RigidBodyインスタンスを生成し、foamエンジンへ追加。 var rigid:RigidBody = new RigidBody(rnd_x, rnd_y, rnd_size, rigid_arr); foam.addElement(rigid);
簡単ですね。
ただ、ちょっと重いかな・・・。まだバージョン0.1.01だもんなぁ・・・。
ソースコード全体は以下。
- Comments: 0
- Trackbacks: 0
[as3][FOAM]初めてのFOAM
- 2008-02-04 (Mon)
- ActionScript3.0 | Library
最近はBox2DFlashAS3と言うのがはやっているようですね。今更いろいろやろうにも出遅れた感が否めないので、ここはあえて違う物理エンジンをいじってみようと思います。
今回触ってみたのは、FOAMという物理エンジンです。
バージョンは0.1.01。まだまだ開発版ということですかね。
ではでは、初めてなので、まずは使い方から。
必要なものは、Foamクラスのインスタンスです。
private var foam:Foam = new Foam(); addChild(foam);
しかも、FoamクラスはSpriteクラスを継承しているため、描画もしてくれます。
なので、addChildしておきます。
foam.addGlobalForceGenerator(new Gravity(new Vector(0, 0.3)));
Gravityクラスが重力になるようです。(まだ調査しきれてません・・・)
これを、先ほどのfoamインスタンスのメソッド、addGlobalForceGeneratorに渡します。
これで、重力発生です。
続いて、オブジェクトを配置します。
FormインスタンスのメソッドaddElementに、ISimulatableインターフェースなインスタンスを渡してやります。
円形や多角形、ベジェ曲線などがISimulatableインターフェースをimplementsしたクラスとして提供されています。
今回は円形と四角を使ったサンプルを作ってみました。
デモはこちら。
ソースは以下。
/**
* FOAM sample1
* @author jinten.net
*/
package {
import flash.display.*;
import org.generalrelativity.foam.dynamics.element.body.*;
import org.generalrelativity.foam.dynamics.enum.Simplification;
import org.generalrelativity.foam.dynamics.force.Gravity;
import org.generalrelativity.foam.Foam;
import org.generalrelativity.foam.math.Vector;
import org.generalrelativity.foam.util.ShapeUtil;
[SWF(width="300", height="300")]
public class FoamSample1 extends Sprite {
private const W:Number = 300;
private const H:Number = 300;
private var foam:Foam;
public function FoamSample1() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.BOTTOM;
//FOAMインスタンスの生成
foam = new Foam();
addChild(foam);
//オブジェクトのドラッグ有効化
foam.useMouseDragger(true);
foam.addGlobalForceGenerator(new Gravity(new Vector(0, 0.3)));
//circle
foam.addElement(new Circle(100, 100, 30));
foam.addElement(new Circle(200, 100, 30));
var wall_arr:Array;
//ground
wall_arr = ShapeUtil.createRectangle(W, 20);
foam.addElement(new RigidBody(W/2, 0, Simplification.INFINITE_MASS, wall_arr));
foam.addElement(new RigidBody(W/2, H, Simplification.INFINITE_MASS, wall_arr));
//wall
wall_arr = ShapeUtil.createRectangle(20, H);
foam.addElement(new RigidBody(0, H/2, Simplification.INFINITE_MASS, wall_arr));
foam.addElement(new RigidBody(W, H/2, Simplification.INFINITE_MASS, wall_arr));
foam.simulate();
}
}
}
- Comments: 0
- Trackbacks: 0
[pv3d]初めてのPaperVision3D(2)
- 2008-01-22 (Tue)
- papervision | ActionScript3.0 | Library
今回も引き続き
pv3d 2.0 tutorial list[pv3d.org]から。
前回でPaperVision3Dで3D描画を行うための世界は整っているので、
今回はその世界に3Dオブジェクトを追加して表示してみます。
と、いってもチュートリアルの通りに進めたところ、すごく簡単でした。
var material:ColorMaterial = new ColorMaterial(col, 0.9); material.doubleSided = true; var plane:Plane = new Plane(material); scene.addChild(plane);
こんな感じで、
ColorMaterialのインスタンスを生成します。
これが、「面」になるようで、ColorMaterialは、色の付いた面になるようです。
material.doubleSided = true;
この部分では、面の裏側も色を塗ることを指定しています。
この指定をしないと片面しか色を塗ってくれないようです。
Planeクラスは「平面」です。
Planeクラスに先ほどの「面」を引数にして生成した後、シーンにaddChildします。
これで、3D空間へ平面を置くことができました。
Planeクラスのyawメソッドなどを呼ぶと平面を回転してくれます。
どのメソッドでどのように回転するかなどは、チュートリアルのサイトの、
3d Object Movement Explorerのページが参考になります。
平面の回転や移動等をしつつ、
前回のソースコードサンプルのようにEnterFrameイベントのリスナーで、
renderer.renderSceneメソッドを呼べば、
3Dの表示&ちょっとしたアニメーションまで完成です。
ちなみに、全然関係ないんですが、今回参考にしたサイトの、
7. Basic Interactivityで、
When starting out with pv3d, many as3 ninjas don’t realize you need to enable interactivity in the viewport and the material before being able to listen to the various click events.
ninjasって・・・忍者?忍者ってこんな自然に文章に混ざっても、英語圏で通じるレベルなのかぁ。ちょっと感動です。
とりあえず、チュートリアルそのままではアレなので少しだけ変えて、
今回のソースコードも公開。
/**
* PaperVision3D sample
* @author jinten.net
*/
package {
import flash.display.Sprite;
import flash.events.Event;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.cameras.FreeCamera3D;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF(backgroundColor = "#FFFFFF", width="400", height="300")]
public class pv3d_sample1 extends Sprite {
private var scene:Scene3D;
private var viewport:Viewport3D;
private var camera:Camera3D;
private var renderer:BasicRenderEngine;
private var planes:Array = new Array();
public function pv3d_sample1() {
init();
}
private function init():void {
scene = new Scene3D();
initObjects();
viewport = new Viewport3D(400, 300);
camera = new Camera3D(planes[0]);
renderer = new BasicRenderEngine();
addChild(viewport);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void {
for (var i:int = 0; i < planes.length; i++) {
planes[i].yaw((i%2==0?2:-2));
}
camera.x = mouseX;
camera.y = mouseY;
renderer.renderScene(scene, camera, viewport);
}
private function initObjects():void {
planes.push(makePlane(0xFF6666, 0, 0, 0));
planes.push(makePlane(0x66FF66, 400, 0, 0));
planes.push(makePlane(0x6666FF, -400, 0, 0));
planes.push(makePlane(0xFFFF66, 0, 400, 0));
planes.push(makePlane(0x66FFFF, 0, -400, 0));
planes.push(makePlane(0xFF66FF, 0, 0, 400));
planes.push(makePlane(0x666666, 0, 0, -400));
}
private function makePlane(col:uint, x:Number, y:Number, z:Number):Plane {
var material:ColorMaterial = new ColorMaterial(col, 0.9);
material.doubleSided = true;
var plane:Plane = new Plane(material, 300, 300);
plane.x = x;
plane.y = y;
plane.z = z;
scene.addChild(plane);
return plane;
}
}
}
- Comments: 0
- Trackbacks: 0
[pv3d]初めてのPaperVision3D(1)
- 2008-01-10 (Thu)
- papervision | ActionScript3.0 | Library
少し時間もあったので、最近流行のPaperVision3Dに手を出してみました。
で、3Dとかさっぱりわからないのですが、とにかく触ってれば、
必要に迫られて色々知識も増えていくだろうということでひとまず参考にしたサイトはこちら。
pv3d 2.0 tutorial list[pv3d.org]
まだ途中みたいですが、チュートリアルになってます。
順に進めていくと、PaperVision3Dでの基本部分のコードの書き方がわかります。
まずは、3Dな世界の構築部分です。
最低限必要なインスタンスは4種類。まずは、インスタンスを生成します。
viewport = new Viewport3D();
scene = new Scene3D();
camera = new FreeCamera3D();
renderer = new BasicRenderEngine();
ちなみにScene3DクラスはSceneObject3Dのサブクラス、
FreeCamera3DはCameraObject3Dのサブクラスです。
シーンやカメラには他にも種類があるようですが、
今回は参考にしたサイトで使っていたクラスをそのままです。
続いてViewport3DのインスタンスをaddChildに渡します。
addChild(viewport);
これで、描画ツリーに3D世界を追加完了。
最後にBasicRenderEngine.rendererメソッドを呼べば描画されます。
renderer.renderScene(scene, camera, viewport);
このとき、scene、camera、viewportの各インスタンスを渡してあげます。
これだけ。
簡単ですね。
まだ3Dオブジェクトを何も置いていないので、何も表示されませんが、
とりあえず今回はテンプレート的にソースコードを出しつつ今日はココまで。
コード全体は以下。
/**
* PaperVision3D sample
* @author jinten.net
*/
package {
import flash.display.Sprite;
import flash.events.Event;
import org.papervision3d.cameras.FreeCamera3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF(backgroundColor = "#FFFFFF")]
public class pv3d_sample1 extends Sprite {
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera:FreeCamera3D;
private var renderer:BasicRenderEngine;
public function pv3d_sample1() {
init();
}
private function init():void {
viewport = new Viewport3D();
scene = new Scene3D();
camera = new FreeCamera3D();
renderer = new BasicRenderEngine();
addChild(viewport);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void {
renderer.renderScene(scene, camera, viewport);
}
}
}
- Comments: 0
- Trackbacks: 0
[as3][lib]Go animation system
- 2007-12-17 (Mon)
- ActionScript3.0 | Library | Flex3 | Flex2
Flexからアニメーションをガリガリ作る時の標準は今はTweenerライブラリなんでしょうかね?
新しく開発中っぽいアニメーション用のライブラリを見つけたのでメモ。
Go animation system
(現在 closed betaらしい)
* とても軽量(およそ4K)
* 柔軟な設計で、高い拡張性を持つ。
* Fuseのようになんでもできるというようなものではない。
* ただし。Goを使ってFuseのようなものを作ることはできる。
* Goは特殊な書き方を要求しない。
* Goのエンジンは10から20000ものアニメーションを動かすことができる。
* 物理エンジンや3Dエンジンと一緒に使えるよう設計されている。
* GoのアプローチはCairngormフレームワークにインスパイアされている。
だ、そうです。
「物理エンジンや3Dエンジンと一緒に使えるよう設計されている。」ってのが興味深いですね。
- Comments: 0
- Trackbacks: 0
[AS3]デバッグの方法
- 2007-10-20 (Sat)
- ActionScript3.0 | Library | AIR | Flex3 | Flex2
こちらの記事[AS3S.ORGさん]でデバッグに便利な環境について書かれていたので。
流れに乗って。
1. Debug Player
これは必須ですね。FlashPlayerのDebug用バージョン。普通のFlashPlayerだとランタイムエラーとか拾ってくれないので。エラーが出ているのに表示されないのでデバッグが余計大変になってしまいます。しかも、普通に動くけど実はエラーが起きているということもあるというのが曲者です。例えば画像の読み込み時のIOErrorとかですね。気がつかないままリリースすると、他の開発者の人に「あーIOErrorをちゃんとハンドルしてないんだー」みたいなことがばれてしまうのは恥ずかしいです。
ちなみに、いろんなベータ版とか試してるうちにこっそりとFlashPlayerが新しく置き換わることが結構あって、気がつかないうちにDebugPlayerではなくなっている、ということもあります。DebugPlayerの場合はFlash/Flex上で右クリックしたときに「デバッグ」というコマンド(ただしグレーで実行できない)が入るようですよ。
2. Flash Tracer
FireFoxのアドオンでtraceの出力をFlreFoxのサイドバーで確認できるというものです。
すごい趣味の問題なんですけど、サイドバーじゃなかったらなぁ、と。デバッグ用の出力ウインドウはなんか画面下に欲しいんですよね。
(FireFoxに他のアドオン入れれば下にできるのかもしれないけど、ブックマークの時とかは横にあって欲しいし・・・)
3. Flash Switcher
FireFoxでFlashPlayerのバージョンを切り替えるアドオンです。
便利なんだけど・・・、他のタブでFlashPlayerが起動してると動かないんですよね。僕は結構タブを多めに開いたままにする派なので、なかなか使いづらい・・・。
FireFoxが常用のブラウザじゃない人には良いかも。
あとは、最近いたるところで話しにのぼっている、
ThunderBoltですね。
FireBugに出力できるというライブラリです。ただの出力か、警告かエラーかなど色々な出力を簡単に実現できるのは良いところですが、ソースコードにデバッグ用のコードが色々残ってしまうのが若干面倒ですね。
FireBugに出力するだけ、という意味では、
ExternalInterface.call("console.log", "hogehoge");
でだせます。自分でうまいことデバッグ用のクラスを書いたほうが後々便利かもしれませんね・・・。
- Comments: 0
- Trackbacks: 0
[AS3]zip解凍
- 2007-10-07 (Sun)
- ActionScript3.0 | Library
as3でzipの操作用ライブラリ
FZip
ライセンスはzlib/libpng license
商用利用もOKなライセンスっぽい。
zipの解凍用で圧縮はできないのかな?このライブラリは。
.airファイルの中身をのぞいたりもできますね。
< ?xml version="1.0" encoding="utf-8"?>
< mx :WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
< mx :Script>
< ![CDATA[
import deng.fzip.FZip;
public var fzip:FZip;
public function init():void{
fzip = new FZip();
var req:URLRequest = new URLRequest();
req.url = "hogehoge.air";
fzip.addEventListener(Event.COMPLETE, loadComplete);
fzip.load(req);
}
public function loadComplete(e:Event):void{
status = fzip.getFileCount().toString();
for(var i:int=0;i<fzip .getFileCount();i++){
ta.text += fzip.getFileAt(i).filename+"n";
ta.text += fzip.getFileAt(i).getContentAsString();
ta.text += "nn";
}
}
]]>
< /mx>
< mx :TextArea id="ta" width="100%" height="100%"/>
< /mx:WindowedApplication>
- Comments: 0
- Trackbacks: 0
Home > Library
- Search
- Feeds
- Meta
- Advertisement

デモ