U⁄A LABO

RSS

SEARCH

AUTHOR

  • KNOCKKNOCK (10件)小遣い2万円のフラッシュデベロッパー。
    帰りが遅いのにキレる嫁をだましだまし制作中・・・。

  • TAKAIW (13件)フラッシュデベロッパー。遊びでゲームを作るのも好きです。外見に似合わないイラストを描くのも好きです。とにかく作るのが好きです。

  • CHIKATHREESIX (8件)メタル界のフラッシュデベロッパー。またある時はメタルギタリスト。オーサリング中もヘッドバンギングは絶やさない。

  • YANBOU (6件)犬と猫で、家が毎日運動会のフラッシュデベロッパー。
    ビールから発泡酒へ変更で節約中。

  • AKUZE (2件)2003年からユナイティアに寄生しているフラッシュデベロッパー。
    シルクドソレイユとカナダが好き。

  • DECO-DEKAI (1件)ビートダウンパートでご飯何杯も食べられます。
    ハードコア・テクニカルディレクターを目指して日々精進。

CATEGORY

HOME  >  Papervision3Dの計算ロジックのみを使う

2009.10.14 CHIKATHREESIX

Papervision3Dの計算ロジックのみを使う

だいぶご無沙汰してしまいました、chikathreesixです。
Loud Parkまであと少し!
でっかいサークルピットができるんだろうな~とわくわくしてます。


さて先日ローンチされた案件でPapervision3Dを使っているのですが、3D空間に表示オブジェクトを表示するけれど、パースなどの変形をさせたくない状況にぶつかりました。
つまり3D座標の計算ロジックのみを使いたいという状況です。

PapervisionのDisplayObject3DにはscreenというNumber3D型のプロパティがあり、これのx,yでスクリーン座標を取得することができます。zは正確にはよくわからないのですが、カメラからの距離かと思われます。

ところが、ここに落とし穴が。。
単にインスタンスを生成してプロパティを参照するだけでは、どうやって試しても値が0になってしまうのです。
DisplayObject3DのautoCalcScreenCoordsプロパティをtrueにしておかないとscreenに値が入らないのです。
ハマりました。。



さて、これで準備は整いました。
screen.xとscreen.yは0を中心とした値なので、表示したい領域の中心座標を足しましょう。
拡大縮小とzソートを行いたい場合は自分で実装する必要があります。
今回その必要があったので、以下のように行いました。


z位置に応じたスケールは以下のように求まります。
bolaはDisplayObject、bola3dはDisplayObject3Dです。

bola.scaleX = bola.scaleY = _camera.focus / (_camera.focus + bola3d.screen.z) * _camera.zoom

zソートはプロパティからバブルソートしました。

 private function _sort(arr:Array):void {
		var i:int
		var j:int;
		var temp:DisplayObject3D;

		for (i = 0; i < arr.length - 1; i++) {
			for (j = arr.length - 1; j > i; j--) {
				if (arr[j - 1].screen.z >arr[j].screen.z) {  /* 前の要素の方が大きかったら */
					temp = arr[j];        /* 交換する */
					arr[j] = arr[j - 1];
					arr[j - 1]= temp;
				}
			}
		}
	}
}

以下のようなサンプルを作ってみました。
(ちょっと上下にガクガクしてしまうのはバグだと思います。。)
←↑↓→ボタンで操作してみてください。


ソースはこちらから
CATEGORY