2

グラフィッククラスの紹介のために、シーンのスポットライトをモデル化しようとしています。この割り当てでは、modernGLですべてを実行する必要があることを指定しているため、レガシーから何も使用できません。

これを支援するためにOpenGL4.0シェーディング言語クックブックを読んでいますが、ライトのアイスペース座標を取得する方法がわかりません。ワールドスペースでライトを配置したい位置と方向を知っているので、次の方法でライトをアイスペースに変換しようとしました。

//mv = inverse(mv);
vec3 light = vec3(vec4(0.0, 15.0, 0.0, 1.0) * mv);
vec3 direction = vec3(vec4(0.0, -1.0, 0.0, 1.0) * mv);

ここで、mvはによって生成されたモデルビューマトリックスです。

glm::mat4 modelview_matrix = glm::lookAt(glm::vec3(window.camera.x, window.camera.y, window.camera.z), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));

変換なしで。ご覧のとおり、モデルビューとモデルビューの逆数を掛けてアイスペースを取得しようとしました。オブジェクトの反対側に移動すると、オブジェクトの鏡面ハイライトが続くため、これらのどちらも機能しなかったと確信しています。(つまり、オブジェクトの反対側を見ている場合、光は鏡面ハイライトを見ることができないはずです。)

4

1 に答える 1

0

私はあなたが望むとかなり確信しています:

vec3 light = vec3(mv * vec4(0.0, 15.0, 0.0, 1.0));
vec3 direction = vec3(mv * vec4(0.0, -1.0, 0.0, 0.0));
                                             // ^ Note the 0 in the w coordinate

マトリックスを反転していない場合。mvはい、乗算の順序は重要です。0座標にaを残す理由wは、方向ベクトルを変換せず、スケーリングまたは回転のみするためです。

于 2013-03-17T01:52:51.333 に答える