« PV3D | Morphing | メイン | PV3D | BasicViewでのボタンの制御 »

PV3D | Primitives

お昼食べた後とかすっごい眠くなりますよネ。

そんなときはちょっと頭を使って脳を活性化!

テトリスみたいにブロックを詰んで倒れないようにするゲーム
PERFECT BALANCE

さて、FlashもPV3Dも初心者なのでいきなり難しい事しないで

まずは基本からキッチリやっていきますよ〜!

by 【t.e.t.u】


まずはPV3Dをダウンロードして(PV3Dのダウンロードはこちらから)

「Flash」→「環境設定」→「ActonScript」→「ActionScript3.0設定」でクラスパスを設定してあげます。

パスは PV3D/as3/trunk/src を設定します。

これで、例えば
  import org.papervision3d〜
とか書くとPV3Dで用意されたクラスが使えるようになるワケです。



さて、前置きはこれくらいでいいとして
PV3Dで基本的な部分て
 ・オブジェクト
 ・カメラ
 ・ビュー
 ・マテリアル
辺りかなーと勝手に決めつけて、まずはそこから攻めてみたいと思います。

とりあえず何か3Dの物体を表示させてみたいので
org.papervision3d.objectsにある
Primitivesからやってみましょー。


PV3Dを使って3Dの表現をする為に最低限必要な事は
 ・3Dの空間の設定
 ・オブジェクト作成配置
 ・オブジェクトを撮るカメラの設定
 ・撮った映像を表示する為のビューを設定
とかかな?


今回はオブジェクトの作成と配置の部分だけでいいので
この辺の初期設定を簡単にやってくれるBasicViewを使いたいと思います。


ホントは自分でやった方がいろいろできるようになると思うので
この辺はまた追々やっていきましょー。
(BasicViewについてはこちら)


ソースをダウンロード

サンプル


サンプルソースではpv3d_01.flaのドキュメントクラスにpv3d01.asを設定して
pv3d01.asファイルにソースを書いています。
package{
	//カメラ関係
	import org.papervision3d.view.*;
	//オブジェクト関係
	import org.papervision3d.objects.primitives.*;
	//マテリアル関係
	import org.papervision3d.materials.*;
	import org.papervision3d.materials.utils.MaterialsList;
	
	//イベント関係
	import flash.events.*; 
	
	//BasicViewクラスを継承してMainクラスを作成
	public class pv3d01 extends BasicView{
		//Mainコンストラクタを作成
		public function pv3d01() {
			//ここに処理を記述していきます
		}
	}
}

まずは下ごしらえ的なところから、
なんとなくでテキトーなコメント入れてますのでおかしいところがあったら指摘してくださいw


コンストラクタでBasicViewを継承するように書いていますが、
BasicViewは 「import org.papervision3d.view.*;」 の部分でインポートしています。
「*」というのは上記であれば「view」の配下を全部〜って意味なんですね。


マテリアルは追加した3Dのオブジェクトがそのままだと透明で見えないから
そこに何か貼付けて見えるようにする為のものと思ってればいいかな?


詳しい事は後々やっていきますのでとりあえず置いておきましょう。


それではまず球体を表示してみましょう。

//オブジェクトを作成
var mySphere:Sphere = new Sphere();
//オブジェクトを追加
scene.addChild( mySphere );
// レンダリング開始
startRendering();

これだけ!
「scene」というのは3Dを表示する為の空間で
そこに「new Sphere();」で作成したオブジェクトを追加して
表示してるだけです。
「scene.addChild();」や「startRendering();」
は、今回BasicViewを継承しているのでいきなり使えてるわけですね〜。


球体の大きさや面の数を変えたりマテリアルを設定するには
引数に以下のような値を与えてあげるといいみたいです。


球体オブジェクト
Sphere(
material:MaterialObject3D = null, //マテリアル
radius:Number = 100, //球の半径
segmentsW:int = 8, //水平方向の分割数
segmentsH:int = 6, //垂直方向の分割数
)


それでは次に四角いオブジェクトを表示させてみたいと思います。

//マテリアルを作成
var materials : WireframeMaterial = new WireframeMaterial();
//マテリアルリストを作成
var mList : MaterialsList = new MaterialsList( {all : materials } );    
//立方体オブジェクトを作成
var myCube:Cube = new Cube(mList,100,100,100);
//オブジェクトを追加
scene.addChild( myCube );
// レンダリング開始
startRendering();

Cubeの定義はこんな感じ↓

立方体オブジェクト Cube(
materials:MaterialsList, //マテリアルリスト
width:Number=500, //幅
depth:Number=500, //奥行き
height:Number=500, //高さ
segmentsS:int=1, //横面の分割数
segmentsT:int=1, //奥行きの面の分割数
segmentsH:int=1, //高さの面の分割数
insideFaces:int=0,
excludeFaces:int=0
)


なんか立方体オブジェクトだけ他とちょっと違うみたいです。
そう、第1引数がマテリアルではなくマテリアルリストになってます。


しかもちゃんとマテリアルリストを渡してあげないとエラーになっちゃうようで…。


マテリアルリストについてもまた後々やりますので、
とりあえずCubeの引数で必要になることを覚えておきましょう。


その他にも↓みたいなオブジェクトが用意されています。


板オブジェクト
Plane(
material:MaterialObject3D=null, //マテリアル
width:Number=0, //幅
height:Number=0, //高さ
segmentsW:Number=0,//横分割数
segmentsH:Number=0, //縦分割数
)

円柱オブジェクト
Cylinder(
material:MaterialObject3D=null, //マテリアル
radius:Number=100, //底面の半径
height:Number=100, //高さ
segmentsW:int=8, //横分割数
segmentsH:int=6, //縦分割数
topRadius:Number=-1, //上面の半径
)

円錐オブジェクト
Cone(
material:MaterialObject3D=null, //マテリアル
radius:Number=100, //底面の半径
height:Number=100, //高さ
segmentsW:int=8, //横分割数
segmentsH:int=6, //縦分割数
)


とりあえずこんなもんでしょうかねー?
そのままだとおもしろくないので
ちょっと回転させてみたりもしてみましょう。


オブジェクトは「rotationY」とか「rotationX」っていう
プロパティを持ってるらしいのでそこに値を設定すると
オブジェクトの向きを変えられるみたいです。


↓みたいにフレーム毎のイベントを設定してやると
球体がぐーるぐーる回ります。


//毎フレーム時のイベントを追加
addEventListener(Event.ENTER_FRAME, enterFrameHandler);

// 毎フレーム時のアニメーション
function enterFrameHandler(event:Event):void
{
	//球を回転
	mySphere.rotationY += 1;
	mySphere.rotationX += 1;
}

初心者なりの解釈で書いてますので、何か間違い等ございましたらご連絡下さいm(__)m


よし、次回はカメラについてだ〜!


参考サイト
 ・FlaTech+

トラックバック

このエントリーのトラックバックURL

コメントを投稿

いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。