ポリゴンレンダラ - その13 [プログラミング]
一番最初に座標変換をまとめたけど、あれではまずいことがわかった。
あれ自身は間違っていないのだけど、今回のアプリにはふさわしくない点があることがわかった。なぜふさわしくないか、は出来上がったときに説明する。ちょっとやり直し。
ということで、スクリーン上に原点をとってz軸をスクリーン手前方向にとる。モデルの座標系(x,y,z)からスクリーン座標系(u,v,w)へは同次座標変換 で結びつけられているとする。Asはユーザがモデルの向きや位置やスケールを指定する行列である。デフォルト、というか最初は同次座標変換の行列Asは単位行列、すなわちモデルの座標系とスクリーン座標系は一致しているとする。従ってデフォルトではモデルのz軸にそって原点を見下ろすような表示になる。最終的にはスクリーン上に表示されるので(u,v,0,1)のかたちにしてNSViewの上に(u,v)として表示する。
視点の位置はスクリーン座標系でp=(pu,pv,pw)の位置にあるとする。 下の図のような感じ。 モデルのある点(gx,gy,gz)が視点から見てスクリーンの(∧gu,∧gv)の位置に投影されたとして、変換を求める。一回やってるので簡単にする。
まず行列Asによって と変換される。
簡単のためいったん視点の位置が原点になるように平行移動する。 そしてw=pwの平面に投影する。 そのあともとの原点に戻してやればスクリーン上の位置が求まる。 整理すると これからスクリーン上の座標(∧gu,∧gv)は となる。
こうしてみると、この行列は0の要素が多いので展開してしまったほうが簡単かもしれない。その場合は式-49は となる。こっちのほうが簡単か。
この場合、デプスソートのための奥行き値が得られないので、視点とモデルの点との距離(の2乗)を別途計算しておかないといけない。
ついでに行列Asのほうも何か簡単な指定の仕方を考えてみる。
Asは4つの成分 からなっているとする。
それぞれ で、z軸まわりの回転、v軸まわりの回転、それからqへの移動、スケーリングである。これだと、かならずモデルのz軸はu−w平面内にあることになるけど、モデルを観察する上でz軸を左右に倒す必要はないのではないか、と思うのでこれでいくことにする。
ちなみにスケーリングは でもいいんだけど、ここでは使わないことにする。
とくに難しいところはないけど、これをどうやってユーザに指定させるか、となるとかなり難しいユーザインターフェイスになる。まあ、それは後で考える。
なんか座標変換の式ばかり書いてる。そろそろ実装を考えよう。でないと何やりたかったんだか忘れてきて、また「なんだっけ?」なんてことになりそう。
10 座標変換のやりなおし
どうしたいかというと、最初は視点の位置を中心にしてほかの座標を変換した。それはそうする方が簡単だったからだけど、そうではなくて、スクリーン座標を中心にしたい。最初、ViewCenter、Viewvertical、ViewPointを使って座標変換を表したけど、それは視点中心の考え方だったのでやめることにする。ということで、スクリーン上に原点をとってz軸をスクリーン手前方向にとる。モデルの座標系(x,y,z)からスクリーン座標系(u,v,w)へは同次座標変換 で結びつけられているとする。Asはユーザがモデルの向きや位置やスケールを指定する行列である。デフォルト、というか最初は同次座標変換の行列Asは単位行列、すなわちモデルの座標系とスクリーン座標系は一致しているとする。従ってデフォルトではモデルのz軸にそって原点を見下ろすような表示になる。最終的にはスクリーン上に表示されるので(u,v,0,1)のかたちにしてNSViewの上に(u,v)として表示する。
視点の位置はスクリーン座標系でp=(pu,pv,pw)の位置にあるとする。 下の図のような感じ。 モデルのある点(gx,gy,gz)が視点から見てスクリーンの(∧gu,∧gv)の位置に投影されたとして、変換を求める。一回やってるので簡単にする。
まず行列Asによって と変換される。
簡単のためいったん視点の位置が原点になるように平行移動する。 そしてw=pwの平面に投影する。 そのあともとの原点に戻してやればスクリーン上の位置が求まる。 整理すると これからスクリーン上の座標(∧gu,∧gv)は となる。
こうしてみると、この行列は0の要素が多いので展開してしまったほうが簡単かもしれない。その場合は式-49は となる。こっちのほうが簡単か。
この場合、デプスソートのための奥行き値が得られないので、視点とモデルの点との距離(の2乗)を別途計算しておかないといけない。
ついでに行列Asのほうも何か簡単な指定の仕方を考えてみる。
Asは4つの成分 からなっているとする。
それぞれ で、z軸まわりの回転、v軸まわりの回転、それからqへの移動、スケーリングである。これだと、かならずモデルのz軸はu−w平面内にあることになるけど、モデルを観察する上でz軸を左右に倒す必要はないのではないか、と思うのでこれでいくことにする。
ちなみにスケーリングは でもいいんだけど、ここでは使わないことにする。
とくに難しいところはないけど、これをどうやってユーザに指定させるか、となるとかなり難しいユーザインターフェイスになる。まあ、それは後で考える。
なんか座標変換の式ばかり書いてる。そろそろ実装を考えよう。でないと何やりたかったんだか忘れてきて、また「なんだっけ?」なんてことになりそう。
2013-06-16 21:55
nice!(0)
コメント(0)
トラックバック(0)
コメント 0