3Dのタッチ操作と四次元の話

| トラックバック(0)

どうも あ〜る です。

 

予告と違って開発中の画面の話ではなく...

3Dのタッチ操作についての話をしようかと。

ちょっと実装にまごついてしまったので自らの恥をさらしてみようかと思います。

ちと長くなると思われますので、ご注意ください。

 

3Dのタッチ操作をするためには、スクリーン上のタッチしている箇所を3D空間上の座標に変換しなければなりません。

ちょっとググってみると...

れごおおじさんが話題に出していた Unity には ScreenToWorldPoint() っちゅー便利なものがあるようですね...。 

ケイプロでは出来る限りタダで開発をしようという思想なので Unity は使いません!

...ので、自力で計算をしなくてはなりません。

 

3Dのとある点Pwをスクリーンに表示するためには

 World座標系 → 視野座標系 → 射影座標系 ( → スクリーン座標)

と変換していきます。

順を追って計算するなら

 Pv = ViewMatrix * Pw

 Pp = ProjectionMatrix * Pv

と計算するはず。

(ここで Pw=World座標系のPos , Pv=View座標系のPos , Pp=Projection座標系のPos)

 

ということは、逆に射影座標系が既にわかっているなら

 Pv = ProjectionMatrix.Inverse * Pp

 Pw = ViewMatrix.Inverse * Pv

と順に計算してやれば

 射影座標系 → 視野座標系 → World座標系

と戻してやれるでしょう。

 

ここまではわかってたんです...。

でも、Psというものについては具体的に考えたことがなかったので

最初に与えるべき値を誤っていたのでした...。

 

ここでこの記事のタイトルにある四次元の話になりますが、

通常3Dゲームを作る時なんかに使う座標と行列って

三次元を扱うのに四次元で表されていますよね?

 P=(x,y,z,w)

みたいな...。

んで、この w 成分ってなんなのよ、ってことですが、

通常World座標系を意識するだけの場合、w=1.0f を入れておけば問題ないので

あんまり意識する事がない成分なんですよね...。

え?そんなのはお前だけだって?...はい、そうですね...阿呆ですみません......。

 

ここで、れごお おじさんにレクチャーしてもらったところ...以下のように自分は理解しました。

自分の言葉に変換して納得しているので、「それはどうなの?」という表現になっているかもしれませんが、ご容赦ください。

 

w ってのは、世界が奥に行くに従ってどれだけギューっと縮めるか、

という係数なんだということなんですね!

 

「投影行列を掛けると射影座標系(同次クリップ空間)になる」ということで

三次元空間上で視錐体が図の様にボックス状になると思い込んで勘違いしていたんです。

(x,y,z)成分だけを考えると、投影行列を掛けた後も視錐体の形はあまり変わらず

z成分が大きくなるにつれ広がる形になっているものと考えられます。

そこで、投影行列を掛けた後のw成分で(x,y,z)成分を割ってあげることで

初めてボックス状にプロットされるということなんですね。

 

この係数wを加えた便宜上の四次元空間を考えた時には、

「投影行列を掛けると射影座標系(同次クリップ空間)になる」

というのは至極もっともな表現かと思います。

しかし、三次元空間に存在している僕には四次元空間は想像出来ません!

そこで、上記のように 三次元+係数 という風に考えたら、すんなり納得できたのでした。

 

手書きでわかりにくいかもしれませんが、視錐体がどのように変換されていくか図にしてみたので掲載します。

projection_exp.jpg

 

ということで、タッチ位置をWorld座標に変換したい場合は

まず、タッチ位置を x=[-1.0f,1.0f] , y=[1.0f,-1.0f] にキャストします。

そして、近平面をタッチしていることにしたい場合は

 z=0.0f , w=-ニアクリップ平面までの距離

とすればよく、

遠平面をタッチしている事にしたい場合は

 z=1.0f , w=-ファークリップ平面までの距離

とすればいいはずです。

wをマイナスにしたりしなかったりは、視野座標系と射影座標系のZ方向によると思います。

 

......そしてこの理解後、ちょっとググってみたら...

http://marupeke296.com/DXG_No55_WhatIsW.html

とうの昔にちゃんと説明してくださっている方がいらっしゃるじゃないですか...。

でも、いろんなレベルの人が同じ事を語ることで、様々な人に理解が広がるんじゃないかと思い

そのままこの記事をアップすることにしました。

 

今更感満載の長話にお付き合い頂きありがとうございました。

トラックバック(0)

トラックバックURL: http://kei-prj.com/mt/mt-tb.cgi/14