kumaryu日記
2009-05-02 ぎにゃー
_ [Riko] 列ベクトル行ベクトル
だまされた。OpenGLは列ベクトルじゃん。
いままで行優先行列に右から列ベクトルをかけてたんですが、Blenderもそうだし世の中的には左から行ベクトルを掛ける方が多いみたいだなー、ということで列優先行列に行ベクトルを左から掛ける形にせっせと直してたんですよ。
で、やっとできたーと思ったら、OpenGLは列優先ベクトルに列ベクトルを右から掛ける仕様だとかいいやがる。
そんなん最初っから確認しとけよという感じですが。 というか列優先=行ベクトル、行優先=列ベクトルと勝手に思い込んでたのが悪いんだけど、行列がどっち優先なのかとベクトルの向きは全く関係ないですねはい。
じゃあベクトルの向きはどっちが普通なのかいろいろ調べたんだけど、まあどっちが普通とかないわな。ただ数学的には列ベクトルが一般的とのこと。
そうするとなんでOpenGLは列優先行列なのかが謎。行優先の方が使い易くね?見た目的にも掛けるときにもさ。
ここはよくわからなかったんだけど、行列は列ベクトルの集合と考えるのかな。まあそれは理解できるんだが、実用上はあんまりメリット無いかもねー。
さてこまったな。方法はいろいろあるんだが。
- せっかく変えたんだしこのまま行ベクトルで突き通す
- 列優先行列で列ベクトルにするのが普通じゃね
- 元の行優先行列と列ベクトルにもどすかー
せっかく変えたんだが行ベクトルはないかなぁ。やっぱり右からベクトルかける方が俺的に普通。それで済むなら越したことはない。というか数学的に普通といわれるとそっちを選びたい。
これを戻すのはそんなに手間じゃないし。
さて行列をどうするかだよな。今は内部的に列優先なんだが、Rubyからみると行優先。行優先の方が便利だとは思うがRubyからみれば行優先なので内部は別にどっちでもいい。
うん、めんどいからこのままにしよう。内部は列優先でそのままOpenGLの関数に渡せる。Rubyからアクセスする分には行優先で直感的。
COLLADAも調べたけど、行列は数学的には列ベクトルの集まりだけど、人にも読み易いように行優先でかいてあるよーとのこと。よくわからん。まあどっちでもいけんだろ。
一応整理しよう。
- OpenGL
- 列優先行列に列ベクトル。
- Blender(のPython)
- 列優先行列に行ベクトル。
- COLLADA
- 行優先行列にベクトルはたぶん列ベクトル。ただし行列は数学的には列行列の集合だと言い張っている。
やっぱりCOLLADA方式が一番好きだなぁ。
ということでさくっと修正。回転、移動、LookAtとかPerspectiveとかOrthogonalなんかの行列生成メソッドを転置するだけだしね。
テストも直して、とにかくこれで数学周りのクラスの変更は一通り完成。
行列でなく拡大、回転移動を別個に持つTransformクラスを作るかどうか悩むところだが、まあいまのところいらんでしょう。
つぎは…うーん、COLLADA読み込みかなぁ。
そういやGSoCでBlenderのCOLLADA Importer/Exporter整理してくれよって奴に人ついたんですね。よかったよかった。
これがうまくいってくれれば俺がもうExporterに手を入れなくて済むんだけど。