« 嫁の挑戦 | Home | エステー »

Feb 252008

スクリーン座標からワールド座標算出

PV3Dには無いのかしら??

一昨年イエカキを作ったときに作った3Dクラスには力技でつけたんだけど、AS2だとQuaternionの逆算部分の処理が重くてリアルタイム処理が厳しかった。(結局初期化の際に、全部変換させている)
多分この算出にはWorldとCameraの情報が必要なので(もううろ覚えだ)両方の情報を保持しているクラスみたいなのがあるのかな?

あのクラスにはカメラのObject traceや、Stage>World変換(Camera変換も)など3Dソフトの機能を付けたのだが、実際は計算処理が重くてほとんどダイナミックに動かせなかった・・・。(一応WorldとCameraと内部のObjectを動かしているけど、ある程度座標値は指定範囲内に収まるようになってるはず)

自分で作ると好きなように色々できて便利だけど、PV3Dのモデリング部分とか見てたらもう一人で作るとかとても無理。

多分スクリーン>ワールド変換ってどこかにあるんだろうけど、深すぎてまだ探しきれてない・・・。
ふあ・・。

ちと昔のソースを見てみた。
自分が実装していたメソッドは
a)World内の特定のObjectを指定のスクリーン座標(x,y)に指定の倍率表示させるための、カメラ位置の取得。
b)World内の特定のObjectを指定のスクリーン座標(x,y)に指定倍率で表示させるための、World座標の取得。
オブジェクトトレースはa)を随時実行していけば自動的にトレースするな・・。
いや、しかし自分で見ても、もうぜんぜんわからない・・・orz
特にQuaternionの逆算部分・・・。確かQuaternionって普通に逆算じゃだめだったんだよな・・。

argXY._y *= -1;
argCR = Tool.d2r(argCR);
var toX = argXY._x * Math.cos(argCR) + argXY._y * Math.sin(argCR);
var toY = argXY._y * Math.cos(argCR) - argXY._x * Math.sin(argCR);
var mQ		: Vector3D	= new Vector3D( 0 , 0 , 0 );
mQ._x = toX * 100 / argS;
mQ._y = -toY * 100 / argS;
mQ._z = argCZ *(100 + argS) / argS; // <- 回転後物体三次元座標		
var iD		: Quaternion = $iniCD.clone ().normalize();
var cD		: Quaternion = new Quaternion( 0 , argCDV ).normalize();
var QQ		: Quaternion = Quaternion.multiplyQQ (iD, cD).normalize();
var dot		: Number = -QQ._n;
var cross	: Vector3D = QQ._v.multiply (-1).normalize();
var theta	: Number = Math.acos(dot);
var cos		: Number = Math.cos (theta *0.5 );
var sin		: Number = Math.sin (theta *0.5 );
if (cross.magnitude == 0)cross = new Vector3D (0, 1, 0);
var Q2		: Quaternion = new Quaternion (cos, cross.multiply (sin));// 回転4元数
var Q2t		: Quaternion = Quaternion.conjugate (Q2);//転置回転4元数
var n		: Number = Quaternion.multiplyQQ (Q2, Q2t)._n;//ノルム
var mP2 = Quaternion.multiplyQVQ(Q2t,mQ,Q2).divideS (n * n).multiplyS(1);
return mP2._v.add(argCP) ;
こんなん書いてるけど、ほんとに俺が書いたのか?と思うぐらいわからないw

5 Comments

お?CoordinateToolsなのが追加されている・・・これでいけるのか?おおお?(ってこれはどー使うんだ?w)

前述のはちと用途がよくわからん・・。World座標とか関係ないかも・・・w
どっちかっつーとVertices3D.projectの逆算のパターンだろうな・・。

PV3DにはQuaternionは無いのか?(無いことはないだろうな・・)
どこだ?Mathとか見当たらないな・・・。

http://yamasv.blog92.fc2.com/blog-entry-128.html

によると
PV3D 2.0からcore.math.Quaternonで追加されたらしい・・。
2.0かぁ・・・汗

2.0ってalphaだよなぁ・・・。
リスキーだなぁ・・汗
それならQuaternonとVector3Dクラスを自分で作った方が安全かなあ・・・。はぁ・・。

Leave a comment

Search and Archives