Labの記事
2009年7月 2日 15:03 written by [ Lab ]
Fractale Tree
as3で木の描画を試してみました。
アルゴリズムはフラクタルのカリフラワーを少し改造してみました。
時間があるときにもう少しリアルさを追求してみようと思います。
(※閲覧にはFlashPlayer10が必要です。)
(※Flashをクリックしたら木が描画されます。やや重いです。)
アルゴリズムはフラクタルのカリフラワーを少し改造してみました。
時間があるときにもう少しリアルさを追求してみようと思います。
(※閲覧にはFlashPlayer10が必要です。)
(※Flashをクリックしたら木が描画されます。やや重いです。)
2009年6月25日 14:10 written by [ Lab ]
Sound Visualization
as3で音を視覚化してみました。
ドットの表現はPV3Dを使っています。
ポイントのみを3D座標に配置して動かすFlashは今まで自作エンジンを使っていたのですが、
今回はPV3Dでやってみました。
(※閲覧にはFlashPlayer10が必要です。)
(※Flashをクリックしたら音がでます。)
(※ドラッグで回転します。)
#参考
http://www.nabble.com/3D-%3E%3E-2D-coordinates-td14730886.html
各ポイントはNumber3Dではなく、空のDisplayObject3Dにすると楽です。
ドットの表現はPV3Dを使っています。
ポイントのみを3D座標に配置して動かすFlashは今まで自作エンジンを使っていたのですが、
今回はPV3Dでやってみました。
(※閲覧にはFlashPlayer10が必要です。)
(※Flashをクリックしたら音がでます。)
(※ドラッグで回転します。)
#参考
http://www.nabble.com/3D-%3E%3E-2D-coordinates-td14730886.html
各ポイントはNumber3Dではなく、空のDisplayObject3Dにすると楽です。
2009年6月16日 18:34 written by [ Lab ]
Basic Spring
バネ運動をActionscriptで再現したものです。
NIKKEのFlashのときにas2で作ったのですが、as3に書き直してみました。
描画はラインのみでほぼ内部計算なので、as3の性能がフル活用できるのではないでしょうか。
下記の例はぶら下がり運動ですが、地面をつけたりすれば一応物理演算系の動作も可能です。
Z座標を追加すれば3D上でも使えます。
(※閲覧にはFlashPlayer10が必要です。)
以下ソースです。
spring_engine.zip
※ご使用は自己責任でお願いします。
※一応MITライセンスってことでお願いします。
※2009/06/17 dumper⇒spring
NIKKEのFlashのときにas2で作ったのですが、as3に書き直してみました。
描画はラインのみでほぼ内部計算なので、as3の性能がフル活用できるのではないでしょうか。
下記の例はぶら下がり運動ですが、地面をつけたりすれば一応物理演算系の動作も可能です。
Z座標を追加すれば3D上でも使えます。
(※閲覧にはFlashPlayer10が必要です。)
※閲覧にはFlashPlayer10が必要です。
以下ソースです。
package {
/***************
* Import
*/
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.utils.getTimer;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.system.System;
import arikata.physics.spring.BasicSpring;
import arikata.physics.spring.Dpoint;
public class SimpleWireFrame extends Sprite {
private var spring1:BasicSpring;
private var spring2:BasicSpring;
private static const Yoffset:uint = 40;
private static const MAX:uint = 10;
private var pic01:Sprite = new Sprite();
private var pic02:Sprite = new Sprite();
private var p1vec:Point = new Point();
private var p2vec:Point = new Point();
private var target:String = "";
private static const PI:Number = Math.PI;
private static const ASIN:Number = 180*Math.asin(3/5)/Math.PI;
private var fps:uint;
private var fpsField:TextField;
public function SimpleWireFrame(){
//Spring生成
spring1 = new BasicSpring();
spring2 = new BasicSpring();
spring1.lineColor = spring2.lineColor = 0xE5D3B0;
spring1.lineThickness = spring2.lineThickness = 2;
//背景画像設置(埋め込み)
addChild(new Bitmap(new BACKGROUND(550,400)));
//Spring設置
addChild(spring1);
addChild(spring2);
//画像01設置(埋め込み)
pic01.addChild(new Bitmap(new SKY01(120,90)));
addChild(pic01);
//画像02設置(埋め込み)
pic02.addChild(new Bitmap(new SKY02(120,90)));
addChild(pic02);
//ピン設置(埋め込み)
var pin01:Sprite = new Sprite();
var pin02:Sprite = new Sprite();
pin01.addChild(new Bitmap(new PIN(18,19)));
pin02.addChild(new Bitmap(new PIN(18,19)));
addChild(pin01);
addChild(pin02);
pin01.y = pin02.y = Yoffset-6;
pin01.x = 150-6;
pin02.x = 400-6;
var i:uint;
var max:uint = MAX;
for(i=0;i<max;i++){
//ポイント生成
spring1.addPoint(150, Yoffset+i-i/MAX, !i);
spring2.addPoint(400, Yoffset+i-i/MAX, !i);
//コネクター生成
if(i>0){
spring1.addConnector(i-1,i);
spring2.addConnector(i-1,i);
}
}
spring1.addPoint(150, Yoffset+i+148, false);
spring2.addPoint(400, Yoffset+i+148, false);
spring1.addConnector(i-1,i);
spring2.addConnector(i-1,i);
spring1.updateList();
spring2.updateList();
spring1.renderStart();
spring2.renderStart();
pic01.buttonMode = pic02.buttonMode = true;
pic01.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
pic02.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
pic01.addEventListener(Event.ENTER_FRAME, enterFrame);
pic02.addEventListener(Event.ENTER_FRAME, enterFrame);
fpsField = new TextField();
fpsField.background = true;
fpsField.autoSize = TextFieldAutoSize.LEFT;
addChild(fpsField);
fps = getTimer();
}
private function mouseDown(e:MouseEvent=null):void{
target = e.target.name.substr(8);
var p1:Dpoint = this["spring"+target].getPoint(MAX-1);
var p2:Dpoint = this["spring"+target].getPoint(MAX);
p1vec.x = p1.x-mouseX;
p1vec.y = p1.y-mouseY;
p2vec.x = p2.x-mouseX;
p2vec.y = p2.y-mouseY;
mouseMove();
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
}
private function mouseMove(e:MouseEvent=null):void{
this["spring"+target].setPoint(MAX-1,mouseX+p1vec.x,mouseY+p1vec.y,true);
this["spring"+target].setPoint(MAX,mouseX+p2vec.x,mouseY+p2vec.y,true);
}
private function mouseUp(e:MouseEvent=null):void{
this["spring"+target].setPointFixed(MAX-1,false);
this["spring"+target].setPointFixed(MAX,false);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
}
private function enterFrame(e:Event=null):void{
var local_target:String = e.target.name.substr(8);
var pic_target:Sprite = this["pic0"+local_target];
var p1:Dpoint = this["spring"+local_target].getPoint(MAX-1);
var p2:Dpoint = this["spring"+local_target].getPoint(MAX);
pic_target.x = p1.x;
pic_target.y = p1.y;
pic_target.rotation = 180*Math.atan2(p2.y-p1.y, p2.x-p1.x)/PI-ASIN;
if(local_target=="1"){
fpsField.text = Math.floor(1000 / (getTimer() - fps)) + "fps\\n" + Number(System.totalMemory / 1024 / 1024).toFixed(2) + 'Mb'
fps = getTimer();
}
}
}
}
spring_engine.zip
※ご使用は自己責任でお願いします。
※一応MITライセンスってことでお願いします。
※2009/06/17 dumper⇒spring
1






