質問: vec4(eye,1); return M; } ``` とゆう関数でして これがどういった処理をしてくれているのか理解できません。
回答: 私3Dのことは全然知らないのですがこのプログラム見てものすごく勉強になりましたので、何を読み取れたかをお伝えします。 最後から読んでいきます。 Mという値を返していますが、これが4×4の行列です。4×4の行列って何かというと、3次元のアフィン変換です。 アフィン変換という言葉、ご存じなかったなら私の昔書いた記事なんですがこちらの解説どうぞ→ アフィン変換/平行移動だって変換行列で 回転・各方向の拡大縮小・水平移動とそれらの自由な順番での組み合わせを4×4の行列で一発記述できますよってのがアフィン変換です。 そう、直線をアフィン変換で表現しようとしているのです。 中学ぐらい数学で直線の式ってどう習いましたっけ。 ``` ax + by + c = 0 ``` の形で表現できるよと習いました(y=ax+bだと不十分です。これだと垂直な線が表現できませんので)。 これは平面上、二次元の直線なのですが、じゃあ、三次元に拡張したら ``` ax + by + cz + d = 0 ``` の形でいいのかというと、これ違うんですよね。この式は、三次元空間内の平面の式になってしまうんです。じゃあ三次元の直線の表し方は、っていうと、「えーと、ベクトルとその基点座標の組み合わせで表したら?」くらいしか知りませんでした。でもアフィン変換で表すの、これ美しいです。 Z軸という直線をうまく回転して水平移動すれば、三次元空間内の任意の直線を表せます。その「うまく回転して水平移動する」操作を4×4の行列で表現しているわけ。M[3]のはじめの要素が水平移動量を表しています。そこにeyeを使っていますから、ちょうど眼の座標へ移動しているんだと読み取れます。M[0], M[1], M[2]のそれぞれはじめの3要素で回転を表現しているのですが、ここは何をどう指定したらどういう回転を意味するのかは不勉強でちゃんと説明できません。 ただ、xaxis, yaxis, zaxisというのが何を意味しているベクトルかまでだったら説明できます。 まずこれら3つはお互いに直角で長さが1のベクトルです。フレミングの右手とか左手の法則の親指・人差し指・中指状態ですよ。で、全部長さが1。単位ベクトル。 アフィン変換の回転表現部分にこの三本指をぶち込むと、どうやらちょうどその三本指にあうように回転してくれるって言ってるように読めます。というかそうとしか読めません。 三本指を一本ずつ読んでいきます。 zaxis、これは視線方向です。長さ1の (eye-center)、これで視線方向のベクトルが取れますから、それをnormalizeして長さ1にしているだけですね。 xaxis、これは主人公の真横方向です。えっと真右になるのかな真左になるのかな、忘れちゃったけどどっちでもいいです。この主人公には視線方向だけでなく頭頂がどっち向いているという方向ベクトル(up)があるので、これと視線方向の外積(cross)をとっています。外積up×zaxisは、upともzaxisとも直角となるベクトルになる(右向きだか左向きだか忘れたけど)ので、つまりほっぺた方向、真横となります。 yaxisは視線・ほっぺた方向両方と直角となる、上方向のベクトルです。上方向って頭頂向きのupがあったじゃない、っていうとそうなんですけど、「見下ろして」いたり「見上げて」いたり、つまり視線方向と頭頂方向が直角じゃないときにいっちしなくなりますので。 とはいえここで一番大事なのはzaxis、視線方向で、Z軸がこのzaxis方向に向くような回転するんだよ、それをeyeの位置まで平衡移動するんだよ、そうして表される直線が法線だよ、という意図がこのプログラムから読み取れました。 おやすみなさい。