ツール作りのお仕事でハマった。視点変換行列を作る関数の指定を間違えてた。
視点と注視点と上方のベクトルを指定するのに、注視点を「位置」だと思ってて、
「なんでモデルが出んのじゃぁ〜」とプログラム全体をとっかえひっかえして一日潰してしまったが、なんのことない。注視点だと思っていたのは注視点方向への「方向」のベクトルであった--;
本物のモデルデータをデザイナさんから受け取りたいのだが会議中だったのでこの暇に各種ライブラリの視点変換行列作成がどうなっているのか調べてみた。
実際にプログラムを組んで調べたわけじゃなく、Web上に転がっているサンプルコードとかを見ただけなので間違っているかもしれないです。もし間違っていたらご一報頂けると嬉しいです。
DirectX 9.0 (D3DX)
D3DXMatrixLookAtLH, D3DXMatrixLookAtRH (pOut, pEye, pAt pUp)
pEye, pAt は位置ベクトル、pUpは方向ベクトル
(Managed DX9だとMatrix::LookAtLHみたいなメソッド)
Mascot Capsule Micro3D Edition version 3(C用インターフェイス)
Atrans3i_setViewTrans(This position, look, up)
position は位置ベクトル、look, upは方向ベクトル
Mascot Capsule Micro3D Edition version 3(Java用インターフェイス)
AffineTrans#lookAt(position, look, up)
不明
DoJa-4.0
Transform#lookAt(position, look, up)
不明
OpenGL (GLUT)
gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz);
eye*, center* は位置ベクトル、up* は方向ベクトル
手元にRenderWareが無いのでRenderWareはわからんかった。
記憶ではRenderWareは視点、注視点、上方、右方向だった気がする。
この右方向が視点とかと直行していなくていいのかどうか、どこにも書いてなくて悩んだ記憶があるような、無いような。
にしてもですよ、こういう間違いが起こるのは全部ベクトル型とか整数型で引数を取るからなんですよ。しかもそのくせマニュアル等々には記述が無かったり解り難かったりする。
ここでPosition3D型とDirection3Dに型を分けておけば間違いは起こらないと思うんですが、どうでしょうお客さん?
ヘッダを見れば一目瞭然、よしんば見ずに適当にやってもコンパイルエラーで気付く。
もっと型で縛ってくれたら楽になるのに!
というわけで今日は変態的に「型で私を縛って下さい!」という心境なのであります。