org.papervision3d.objects.Plane クラスの segmentsW と segmentsH の数をいろいろ変えてみるテスト。どんな三角形に分割されているか知りたかったから。
segmentsW と segmentsH に指定した数が0のときは、1という扱いになるらしい。
Papervision3D API Documentation には次のように書いてある。
segmentsW:Number (default = 0) - [optional] - Number of segments horizontally. Defaults to 1.
segmentsH:Number (default = 0) - [optional] - Number of segments vertically. Defaults to segmentsW.
以下、サンプルコード。
ソースコード: Planes.as
package {
import flash.display.*;
import flash.events.*;
import org.papervision3d.scenes.*;
import org.papervision3d.objects.*;
import org.papervision3d.cameras.*;
import org.papervision3d.materials.*;
public class Planes extends Sprite {
private var container : Sprite;
private var scene : Scene3D;
private var camera : Camera3D;
private var rootNode : DisplayObject3D;
private var obj:Array = new Array();
// 3Dオブジェクト踊らせ用パラメータ
private var valx : Number = 0;
public function Planes():void {
// 画面いっぱいに表示(縦横比無視)したいときはコレを使う
// stage.scaleMode = StageScaleMode.EXACT_FIT;
// リサイズに対応(swfをブラウザで直接ひらいているときとか)
stage.addEventListener(Event.RESIZE, onStageResize);
// 定期的にイベント発生
addEventListener(Event.ENTER_FRAME, myLoopEvent);
// 表示用の Sprite オブジェクトを生成
container = new Sprite();
container.x = 400 / 2; // at center : swf width = 400
container.y = 400 / 2; // at center : swf height = 400
addChild(container);
// シーンオブジェクトを作る
scene = new Scene3D(container);
// カメラオブジェクトを作る
camera = new Camera3D();
camera.z = -200;
camera.focus = 500;
camera.zoom = 1;
// ルートノードを作る
rootNode = new DisplayObject3D();
scene.addChild(rootNode);
// いろんな3Dオブジェクトを作ってみて、配列に入れておく
obj.push(createWireframePlane(-100, 200, 0, 0));
obj.push(createWireframePlane( 0, 200, 1, 0));
obj.push(createWireframePlane( 100, 200, 0, 1));
obj.push(createWireframePlane(-100, 100, 1, 1));
obj.push(createWireframePlane( 0, 100, 2, 1));
obj.push(createWireframePlane( 100, 100, 1, 2));
obj.push(createWireframePlane(-100, 0, 2, 2));
obj.push(createWireframePlane( 0, 0, 3, 2));
obj.push(createWireframePlane( 100, 0, 2, 3));
obj.push(createWireframePlane(-100, -100, 3, 3));
obj.push(createWireframePlane( 0, -100, 4, 3));
obj.push(createWireframePlane( 100, -100, 3, 4));
obj.push(createWireframePlane(-100, -200, 4, 4));
obj.push(createWireframePlane( 0, -200, 4, 1));
obj.push(createWireframePlane( 100, -200, 1, 4));
// 3Dオブジェクトをルートノードに追加
for(var i:int; i<obj.length; i++){
rootNode.addChild(obj[i]);
}
}
private function createWireframePlane(x:int, y:int, segmentsW:Number, segmentsH:Number):DisplayObject3D {
var material:WireframeMaterial = new WireframeMaterial();
material.oneSide = false;
material.lineColor = 0x00FF00;
material.lineAlpha = 1;
var planeSize:int = 90;
var plane:Plane = new Plane(
material, planeSize, planeSize, segmentsW, segmentsH);
plane.x = x;
plane.y = y;
plane.z = 0;
return plane;
}
private function myLoopEvent( event:Event ):void {
valx += container.mouseX / 10;
for(var i:int; i<obj.length; i++){
obj[i].rotationY = valx;
}
scene.renderCamera(camera);
}
private function onStageResize(event:Event):void {
container.x = stage.stageWidth / 2;
container.y = stage.stageHeight / 2;
}
}
}
設定ファイル: Planes-config.xml
<flex-config>
<output>Planes.swf</output>
<default-size>
<width>400</width>
<height>400</height>
</default-size>
<default-frame-rate>30</default-frame-rate>
<default-background-color>0x000000</default-background-color>
<use-network>true</use-network>
<benchmark>true</benchmark>
<compiler>
<incremental>true</incremental>
<source-path>
<path-element>../libs/</path-element>
</source-path>
</compiler>
</flex-config>
../libs/ 以下に Papervision3D 1.5 のソースコードを設置。
コンパイル風景
Flex 2.0.1 でコンパイル。
C:\>mxmlc Planes.as
Planes.swf が生成される。
tags: zlashdot Flash Flash Flex Papervision3D
Posted by NI-Lab. (@nilab)