2017-02-12 78 views
0

爲了好玩,我在opengl中製作了一個3d攝像頭。它運作良好,除了我無法弄清楚如何限制X軸的旋轉。如果向上滾動過多,則向上和向下控制將反轉。我試圖將camFront.y變量限制爲任意值,但相機仍會翻轉x軸。在opengl中圍繞x軸限制旋轉

這裏是我的代碼:

#ifndef CAMERA_H 
#define CAMERA_H 

#include <GL/glew.h> 

#include <GLFW/glfw3.h> 

#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 
#include <glm/gtc/quaternion.hpp> 
#include <glm/gtx/quaternion.hpp> 

#define WORLD_UP glm::vec3(0.0f, 1.0f, 0.0f) 

#include <iostream> 


enum CamDirection { 
    CAM_FORWARD, 
    CAM_BACKWARD, 
    CAM_LEFT, 
    CAM_RIGHT 
}; 


class Camera { 
public: 
    void cameraUpdate(); 

    glm::mat4 getViewMatrix(); 

    Camera(); 

    Camera(glm::vec3 startPosition); 

    void move(CamDirection dir, GLfloat deltaTime); 

    void look(double xOffset, double yOffset); 

    void update(); 

private: 

    glm::vec3 camPos; 
    glm::vec3 camFront; 
    glm::vec3 camUp; 
    glm::vec3 camRight; 

    const GLfloat camSpeed = 5.05f; 

}; 

glm::mat4 Camera::getViewMatrix() { 
    return glm::lookAt(camPos, camPos + camFront, camUp); 
} 

Camera::Camera(): 
    camPos (glm::vec3(0.0f, 0.0f, 0.0f)), 
    camFront(glm::vec3(0.0f, 0.0f, -1.0f)), 
    camUp (WORLD_UP) 
{} 

Camera::Camera(glm::vec3 startPos): 
    camPos (startPos), 
    camFront (glm::vec3(0.0f, 0.0f, -1.0f)), 
    camUp (WORLD_UP) 
{} 

void Camera::move(CamDirection dir, GLfloat deltaTime) { 
    const GLfloat v = camSpeed * deltaTime; 
    if (dir == CAM_FORWARD) 
     camPos += v * camFront; 
    else if (dir == CAM_BACKWARD) 
     camPos -= v * camFront; 
    else if (dir == CAM_RIGHT) 
     camPos += v * camRight; 
    else 
     camPos -= v * camRight; 
} 
void Camera::look(double xOffset, double yOffset) { 
    glm::quat startQuat = {0, camFront.x, camFront.y, camFront.z}; 

    glm::quat rotation = glm::angleAxis((GLfloat)xOffset, glm::vec3(0.0f, 1.0f, 0.0f)); 
    glm::quat view = startQuat * rotation; 

    rotation = glm::angleAxis((GLfloat)yOffset, glm::vec3(-1.0f, 0.0f, 0.0f)); 
    view = view * rotation; 

    camFront = glm::vec3(view.x, view.y, view.z); 
    std::cerr << camFront.x << ' ' << camFront.y << ' ' << camFront.z << std::endl; 

} 

void Camera::update() { 
     // Also re-calculate the Right and Up vector 
     camRight = glm::normalize(glm::cross(camFront, WORLD_UP)); // Normalize the vectors, because their length gets closer to 0 the more you look up or down which results in slower movement. 
     camUp = glm::normalize(glm::cross(camRight, camFront)); 
} 
#endif // CAMERA_H 

我怎樣才能解決這個問題?

回答

0

您需要限制view.yview.z的值,然後將它們分配給camFront,最大值爲89度,最小值爲-89度。在90度和-90度時,它開始反轉。所以一個非常簡單的方法可能是,

if(view.y > 89) 
{ 
    view.y = 89; 
} 
if(view.y < -89) 
{ 
    view.y = -89; 
} 
if(view.z > 89) 
{ 
    view.z = 89; 
} 
if(view.z < -89) 
{ 
    view.z = -89; 
}