BLOG ENTRY

PV3Dの7種類のPrimitiveObject[as3]

Sphere

papervision3Dで扱えるプリミティブオブジェクトについて、各オブジェクトごとにどうコードが変わるのか差分を比較してみます。

まず最初に、この記事はこちらの記事を参考にさせて頂きました。
勉強させて頂きます。どうもありがとうございます。

で、なにやらpapervision3Dで扱えるオブジェクトは7種類とのこと。

Plane : 平面のオブジェクト
Sphere : 球面のオブジェクト
Cube : 立方体のオブジェクト
Cone : 3角コーン型のオブジェクト
Cylinder : 円柱のオブジェクト
PaperPlane : 紙飛行機のオブジェクト
Arrow : 矢印のオブジェクト

基準となるコードを元に7種類のプリミティブオブジェクトごとにコードを書いていく。
(Flash IDEは必要ありません)

基準となるコード PrimitiveObject.as

[as3]
package {

import flash.display.*;
import flash.events.*;
import flash.utils.*;
import org.papervision3d.core.math.Plane3D;

import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.view.BasicView;

[SWF(width = "440", height = "270", frameRate = "30", backgroundColor = "#000000")]

public class PrimitiveObject extends BasicView {

private var obj:Plane;

public function PrimitiveObject() {

var world = new BasicView();
addChild(world);
world.startRendering();

var material = new WireframeMaterial(0xffffff);
material.doubleSided = true;

obj = new Plane(material, 500, 500, 1, 1);
world.scene.addChild(obj);

addEventListener(Event.ENTER_FRAME, enterHandler);
}

private function enterHandler(e:Event):void {
obj.rotationY += 2;
}
}
}
[/as3]
で、これをコンパイルするとこれになる

Plane : 平面のオブジェクト

[SWF]/wp-content/uploads/swf/primitive_object/PlaneObj.swf, 440, 270[/SWF]

このコードのプロパティ
private var obj:Plane;
とオブジェクトのインスタンス生成
obj = new Plane(material, 500, 500, 1, 1);
の2行だけを以下の通り書き換えて全7種類のオブジェクトを表示する

Sphere : 球面のオブジェクト

[SWF]/wp-content/uploads/swf/primitive_object/SphereObj.swf, 440, 270[/SWF]
[as3]
private var obj:Sphere;
obj = new Sphere(material, 324, 8, 8);
[/as3]

Cube : 立方体のオブジェクト

[SWF]/wp-content/uploads/swf/primitive_object/CubeObj.swf, 440, 270[/SWF]
[as3]
private var obj:Cube;
obj = new Cube(new MaterialsList({all : material}), 400, 400, 400, 1, 1, 1);
[/as3]

Cone : 3角コーン型のオブジェクト

[SWF]/wp-content/uploads/swf/primitive_object/ConeObj.swf, 440, 270[/SWF]
[as3]
private var obj:Cone;
obj = new Cone(material, 300, 300, 8, 8);
[/as3]

Cylinder : 円柱のオブジェクト

[SWF]/wp-content/uploads/swf/primitive_object/CylinderObj.swf, 440, 270[/SWF]
[as3]
private var obj:Cylinder;
obj = new Cylinder(material, 300, 300, 10, 10, -1);
[/as3]

PaperPlane : 紙飛行機のオブジェクト

[SWF]/wp-content/uploads/swf/primitive_object/PaperPlaneObj.swf, 440, 270[/SWF]
[as3]
private var obj:PaperPlane;
obj = new PaperPlane(material, 4);
[/as3]

Arrow : 矢印のオブジェクト

[SWF]/wp-content/uploads/swf/primitive_object/ArrowObj.swf, 440, 270[/SWF]

[as3]
private var obj:Arrow;
obj = new Arrow(material);
[/as3]

こんな感じで、オブジェクトのインスタンス生成してる箇所(とその引数)だけで、
後は同じ作り方でOKということがわかりました。

ついでにパラメータも書いとく。

オブジェクトのパラメータ

width : 横幅
height : 高さ
depth : Cubeにおける奥行き
radius : 半径。Sphere では球体の半径で、ConeとCylinderでは底辺の半径。
segmentsW : 横方向の分割数
segmentsH : 縦方向の分割数

パラメータでちょっと適当に遊んでみる

[SWF]/wp-content/uploads/swf/primitive_object/PrimitiveObject.swf, 440, 270[/SWF]
[as3]
package {

import flash.display.*;
import flash.events.*;
import flash.utils.*;
import org.papervision3d.core.math.Plane3D;

import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.view.BasicView;

[SWF(width = "440", height = "270", frameRate = "30", backgroundColor = "#000000")]

public class PrimitiveObject extends BasicView {

private var obj:Sphere;

public function PrimitiveObject() {

var world = new BasicView();
addChild(world);
world.startRendering();

var material = new WireframeMaterial(0xffffff);
material.doubleSided = true;

obj = new Sphere(material, 324, 8, 8);
world.camera.y = 400;
world.scene.addChild(obj);

addEventListener(Event.ENTER_FRAME, enterHandler);
}

private function enterHandler(e:Event):void {
with (obj) {
rotationY += 1;
rotationX += 2;
x = 400 * Math.cos(getTimer() / 400);
z = 100 * Math.cos(getTimer() / 400);
//y = 100 * Math.sin(getTimer() / 2000);
depth = 500 * Math.sin(getTimer() / 1000);
radius = 100 * Math.sin(getTimer() / 4000);
segmentsW = 2000 * Math.sin(getTimer() / 1000);
segmentsH = 2000 * Math.sin(getTimer() / 1000);
}
}
}
}
[/as3]

おしまい。

WRITE COMMENT


(required)


(required)


(required)

MENU

veltica creative of twitter