EYE、DIR、UP の 3 つのベクトルを更新して、FPS スタイルのカメラを実装しようとしています。これらのベクトルは、gluLookAt で使用されるものと同じです (gluLookAt はカメラの位置、カメラが見ている方向、およびアップ ベクトルによって指定されるため)。
私はすでに左右と上下の機銃掃射の動きを実装していますが、静止したままカメラを周りを見回すための背後にある数学を理解するのに苦労しています. この場合、EYE ベクトルは同じままですが、DIR と UP を更新する必要があります。
以下は私が試したコードですが、正しく動作していないようです。助言がありますか?
void Transform::left(float degrees, vec3& dir, vec3& up) {
vec3 axis;
axis = glm::normalize(up);
mat3 R = rotate(-degrees, axis);
dir = R*dir;
up = R*up;
};
void Transform::up(float degrees, vec3& dir, vec3& up) {
vec3 axis;
axis=glm::normalize(glm::cross(dir,up));
mat3 R = rotate(-degrees, axis);
dir = R*dir;
up = R*up;
};
回転メソッドは、軸を中心に角度を回転する回転行列を作成します。
--
編集:これを編集しました(「dir」を「center」にも切り替えました)が、それでも機能しませんでした。左右に回転させようとしても何も起こりません。上下に回転しようとすると、オブジェクトが消えます。
void Transform::left(float degrees, vec3& center, vec3& up) {
center = center*rotate(-degrees,glm::normalize(up));
}
void Transform::up(float degrees, vec3& center, vec3& up) {
vec3 axis = glm::normalize(glm::cross(center,up));
center = center*rotate(-degrees, axis);
}