2

glm::quat で定義された方向に沿ってカメラの位置を変換しようとしています。

void Camera::TranslateCameraAlongZ(float distance) {
    glm::vec3 direction = glm::normalize(rotation * glm::vec3(0.0f, 0.0f, 1.0f));
    position += direction * distance;
}

これは、回転が恒等四元数の場合にうまく機能します。回転が他のものである場合、X および Z の移動は機能しません。カメラを左に 45 度回転させて呼び出すTranslateCameraAlongZ(-0.1f)と、右に後ろに移動する必要があるときに、左に左に移動します。完全な 90 度の増分ではないすべての変換は、同様に台無しになります。ここで何が間違っていますか?それを修正する最も簡単な方法は何ですか? 関連する可能性がある場合に備えて、ビューマトリックスを生成する関数とカメラを回転させる関数を次に示します。

glm::mat4 Camera::GetView() {
    view = glm::toMat4(rotation) * glm::translate(glm::mat4(), position);
    return view;
}

void Camera::RotateCameraDeg(float x, float y, float z) {
    rotation = glm::normalize(glm::angleAxis(x,glm::vec3(1.0f, 0.0f, 0.0f)) * rotation);
    rotation = glm::normalize(glm::angleAxis(y,glm::vec3(0.0f, 1.0f, 0.0f)) * rotation);
    rotation = glm::normalize(glm::angleAxis(z,glm::vec3(0.0f, 0.0f, 1.0f)) * rotation);
    std::cout << glm::eulerAngles(rotation).x  << " " << glm::eulerAngles(rotation).y << " " << glm::eulerAngles(rotation).z << "\n";
}
4

1 に答える 1