1

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);
}
4

1 に答える 1

0

rotate() メソッドが定義されていません。実装するのを忘れていたようです。そして、それは任意の軸を中心とした回転のようです。方程式http://upload.wikimedia.org/math/f/b/a/fbaee547c3c65ad3d48112502363378a.png
(軸と角度からの回転行列) フォーム Wiki httpから実装できます。 ://en.wikipedia.org/wiki/Rotation_matrix

コード:

mat3 Transform::rotate(const float degrees, const vec3& axis) { 
glm::mat3 m3;
glm::mat3 I(1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f);
glm::mat3 T(axis.x*axis.x, axis.x*axis.y, axis.x*axis.z,axis.y*axis.x, axis.y*axis.y, axis.y*axis.z,axis.z*axis.x, axis.z*axis.y, axis.z*axis.z);
glm::mat3 A(0.0f,-axis.z, axis.y, axis.z, 0.0f, -axis.x,-axis.y,axis.x,0.0f);
m3 = glm::cos(degrees)*I + (1.0f-glm::cos(degrees))*T + glm::sin(degrees)*A;  return m3;}
于 2012-11-20T14:14:22.577 に答える