SSブログ

ポリゴンレンダラ - その13 [プログラミング]

一番最初に座標変換をまとめたけど、あれではまずいことがわかった。 あれ自身は間違っていないのだけど、今回のアプリにはふさわしくない点があることがわかった。なぜふさわしくないか、は出来上がったときに説明する。ちょっとやり直し。

10  座標変換のやりなおし

どうしたいかというと、最初は視点の位置を中心にしてほかの座標を変換した。それはそうする方が簡単だったからだけど、そうではなくて、スクリーン座標を中心にしたい。最初、ViewCenter、Viewvertical、ViewPointを使って座標変換を表したけど、それは視点中心の考え方だったのでやめることにする。

ということで、スクリーン上に原点をとってz軸をスクリーン手前方向にとる。モデルの座標系(x,y,z)からスクリーン座標系(u,v,w)へは同次座標変換
0616eq43.png
で結びつけられているとする。Asはユーザがモデルの向きや位置やスケールを指定する行列である。デフォルト、というか最初は同次座標変換の行列Asは単位行列、すなわちモデルの座標系とスクリーン座標系は一致しているとする。従ってデフォルトではモデルのz軸にそって原点を見下ろすような表示になる。最終的にはスクリーン上に表示されるので(u,v,0,1)のかたちにしてNSViewの上に(u,v)として表示する。

視点の位置はスクリーン座標系でp=(pu,pv,pw)の位置にあるとする。
下の図のような感じ。
0616fir12.png
モデルのある点(gx,gy,gz)が視点から見てスクリーンの(gu,gv)の位置に投影されたとして、変換を求める。一回やってるので簡単にする。

まず行列Asによって
0616eq44.png
と変換される。

簡単のためいったん視点の位置が原点になるように平行移動する。
0616eq45.png
そしてw=pwの平面に投影する。
0616eq46.png
そのあともとの原点に戻してやればスクリーン上の位置が求まる。
0616eq47.png
整理すると
0616eq48.png
これからスクリーン上の座標(gu,gv)は
0616eq49.png
となる。

こうしてみると、この行列は0の要素が多いので展開してしまったほうが簡単かもしれない。その場合は式-49は
0616eq50.png
となる。こっちのほうが簡単か。

この場合、デプスソートのための奥行き値が得られないので、視点とモデルの点との距離(の2乗)を別途計算しておかないといけない。

ついでに行列Asのほうも何か簡単な指定の仕方を考えてみる。

Asは4つの成分
0616eq51.png
からなっているとする。

それぞれ
0616eq52.png
で、z軸まわりの回転、v軸まわりの回転、それからqへの移動、スケーリングである。これだと、かならずモデルのz軸はuw平面内にあることになるけど、モデルを観察する上でz軸を左右に倒す必要はないのではないか、と思うのでこれでいくことにする。

ちなみにスケーリングは
0616eq56.png
でもいいんだけど、ここでは使わないことにする。

とくに難しいところはないけど、これをどうやってユーザに指定させるか、となるとかなり難しいユーザインターフェイスになる。まあ、それは後で考える。

なんか座標変換の式ばかり書いてる。そろそろ実装を考えよう。でないと何やりたかったんだか忘れてきて、また「なんだっけ?」なんてことになりそう。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立06/16献立06/17 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。