私は OpenGL でスポット ライト変換システムに取り組んでいます。知られているように、スポット ライトにはデフォルトで位置とコーンの方向があります。しかし、私の実装では、回転と向きも必要です。この場合、回転 -ライトコーンのローカル回転方向- ローカル回転が適用された後のコーンのワールド回転。
glm::lookAt メソッドが出力行列の「目」ベクトルを反転するという事実に部分的に起因するこの作業中に、あらゆる種類の軸反転の問題が発生しました。逆方向ではないスポット ライト コーン面を取得するには:
lookatMatr[2].y =- lookatMatr[2].y;
lookatMatr[2].z =- lookatMatr[2].z;
私は2つのことを理解できません:
1.最後に反転を行う必要がないようにするにはどうすればよいですか。2 .Y 軸と Z 軸にのみ反転が必要な理由。
変換の完全なコードは次のとおりです。
glm::vec4 worldPos = WorldMatr * _pos ;
glm::vec4 worldDir = WorldMatr * glm::vec4( _lightDir,1) ;
glm::vec4 worldUp = WorldMatr * glm::vec4(Y_AXIS,1) ;
//first construct lookat matrix to get direction vector
glm::mat4 lookatMatr = glm::lookAt(glm::vec3(worldPos),glm::vec3(worldDir),glm::vec3(worldUp)) ;
//rotate locally :
lookatMatr = glm::rotate(lookatMatr,30.0f,X_AXIS) ;
lookatMatr = glm::rotate(lookatMatr,0.0f,Y_AXIS) ;
lookatMatr = glm::rotate(lookatMatr,0.0f,Z_AXIS) ;
//Orient :
lookatMatr = Transform().GetOrientationMatrix() * ( lookatMatr );
_posOut= worldPos ;
// lookatMatr[2].x =- lookatMatr[2].x;//why only Y and Z to be inverted?
lookatMatr[2].y =- lookatMatr[2].y;
lookatMatr[2].z =- lookatMatr[2].z;
_dirOut= ( lookatMatr[2]) ;
アップデート:
わかりました、以下で提案されているように、_lightDir の w 部分をゼロに設定し、これを実行しています。
_dirOut=World * Transform().GetOrientationMatrix() * rotMatr * glm::vec4( _lightDir,0);
ライトコーンは正しく表示されていますが、その方向は X 軸上で反転しています。