2008年01月29日

WOWEngineを使ってみた

先日紹介したWOWEngineを使ってみました。


こちらのサイトのを参考にさせてもらいました。
文系の方ですが独自で勉強なさっているみたいです。
自分も見習わなければ!


package{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.geom.*;

import org.papervision3d.scenes.*;
import org.papervision3d.objects.*;
import org.papervision3d.cameras.*;
import org.papervision3d.materials.*;
import org.papervision3d.events.*;
import org.papervision3d.utils.*;

import org.papervision3d.core.*;
import org.papervision3d.core.proto.*;
import org.papervision3d.core.geom.*;

import caurina.transitions.Tweener;

import fr.seraf.wow.primitive.WOWPlane;
import fr.seraf.wow.primitive.WSphere;
import fr.seraf.wow.primitive.WBoundArea;
import fr.seraf.wow.core.WOWEngine;
import fr.seraf.wow.core.data.WVector;
import fr.seraf.wow.constraint.WSpringConstraint;

[SWF(backgroundColor = 0x3333aa)]

public class MultiBlock extends Sprite{
private var REF:Number = 1;
private var GRAV:Number = - 9.8;
private var MASS:int = 10; // ブロックの質量

private var container : Sprite;
private var scene : InteractiveScene3D;
private var camera : Camera3D;
private var rootNode : DisplayObject3D;
private var objArray : Array = new Array();
private var posArray : Array = new Array();
private var wow : WOWEngine;
private var boundArea : WBoundArea;

private var floor : Cube; // 床

private var tf : TextField;
private var SIZE : int = 150; // 箱の大きさ
private var NUMBER : int = 40; // オブジェクトの数
private var rotX : Number = 0;
private var rotY : Number = 0;

public function MultiBlock():void{
stage.frameRate = 60;
stage.quality = "MEDIUM";
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
this.addEventListener(Event.ENTER_FRAME, loop );
this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);

this.container = new Sprite();
addChild(this.container);
this.container.x = this.stage.stageWidth / 2;
this.container.y = this.stage.stageHeight / 2;

initWOW();

// シーン生成
scene = new InteractiveScene3D(container);

// カメラ設定
camera = new Camera3D();
camera.z = -10000;
camera.focus = 200;
camera.zoom = 3;

// rootNode生成
rootNode = new DisplayObject3D("rootNode");
scene.addChild(rootNode);
rootNode.rotationX = 30;

// マテリアル設定
var temp:WireframeMaterial = new WireframeMaterial(0x00ff00, 0.5);
temp.oneSide = false;
var green:MaterialsList = new MaterialsList(); // 床用
green.addMaterial(temp, 'all');
var white:MaterialsList = new MaterialsList(); // 箱用
white.addMaterial(new WireframeMaterial(0xffffff),'all');

// object生成
for(var i:int = 0;i < NUMBER;i++){
objArray[i] = new Sphere(new WireframeMaterial(0xffffff), SIZE, 4, 4);
objArray[i].x = (Math.random() - 1) * 1200;
objArray[i].y = Math.random() * 1000;
objArray[i].z = (Math.random() - 1) * 1200;
objArray[i].name = "mySphere" + i;
rootNode.addChild(objArray[i]);
}

// 床生成
floor = new Cube(green,3000,3000,3000,1,1,1);
floor.meshSort = 0;

rootNode.addChild(floor);

// テキストフィールド
tf = new TextField();
tf.defaultTextFormat = new TextFormat("Verdana", 16, 0xFFFFFFFF); // フォントの種類とサイズ、色
tf.selectable = false;
tf.width = 300;
addChild(tf);

}

// wowengineの準備
private function initWOW():void{
wow = new WOWEngine(1);
wow.collisionResponseMode = wow.SELECTIVE;
wow.addMasslessForce(new WVector(0, -3, 0));
for(var i:uint = 0; i < NUMBER; i++){
var sphere:WSphere = new WSphere(Math.random() * 1500 - 500, Math.random() * 1500 - 500, Math.random() * 1500 - 500, SIZE, false, 1, .8);
sphere.velocity = new WVector(Math.random() * 150 - 75, Math.random() * 150 - 75, Math.random() * 150 - 75);
wow.addParticle(sphere);
posArray.push(sphere);
}
wow.damping = 0.98;
boundArea = new WBoundArea(3000, 3000, 3000);
boundArea.setPosition(0, 0, 0);
boundArea.elasticity = 1;
boundArea.friction = 0.000;
wow.setBoundArea(boundArea);
}

private function loop(event:Event):void{
wow.step();

for(var i:uint = 0; i < NUMBER; i++){
objArray[i].x = posArray[i].px;
objArray[i].y = posArray[i].py;
objArray[i].z = posArray[i].pz;
}

// カメラの回転
rotY += container.mouseY / 100;
rotX += container.mouseX / 100;
rootNode.yaw(.3);
floor.rotationX = rotX;
boundArea.setRotation(-rotX, 0, 0);

scene.renderCamera(camera);
}

private function mouseDown (mevt:MouseEvent):void {
for(var i:int = 0;i < NUMBER;i++){
objArray[i].x = (Math.random() - 1) * 1200;
objArray[i].y = Math.random() * 1000;
objArray[i].z = (Math.random() - 1) * 1200;
}
}
}
}


実行ファイル


WOWEngineはPV3Dとは別に独自に3D空間を持ち
そこでスフィアやパーティクル、ボックスを生成して物理演算を行います。
計算した速度やら位置のデータを出してくれるので
それをPV3Dに適用するという手順になります。

二重になるので少し無駄な感じはしますが
扱うには簡単なほうだと思います。


といっても自分もまだWOWEngineのことを
全部わかっているわけではないので当たっているかわかりませんが。。


これからも要勉強です!
posted by 夏ミカン at 12:32| 沖縄 雨| Comment(0) | TrackBack(0) | ActionScript3.0 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/81236748

この記事へのトラックバック