2017-02-12 7 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

camFront에 할당하기 전에 view.yview.z 값을 최대 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; 
} 
관련 문제