2013-03-24 6 views
0

Я пытаюсь сделать класс, чтобы ходить по миру в OpenGL, но у меня проблемы с математикой. Моя идея здесь - использовать функцию lookAt from glm, чтобы установить наблюдателя в нужное положение, а затем просто работать с точками, которые я передаю функции. Я думаю, что функции для выполнения поворотов, которые я сделал, верны, но часть перевода в методе ходьбы кажется неправильной, и когда я пытаюсь ходить в мире, если я просто переводил или просто вращался, все идет правильно, но когда я делаю обе вещи, просто перепутались.Перевод камеры в OpenGL

вот класс до сих пор:

#ifndef OBSERVER_H 
#define OBSERVER_H 

#include <GL/gl.h> 
#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 

class Observer { 

private: 

    glm::vec3 eye, center, upp; 

public: 

    glm::mat4 view; 

    Observer() {} 
    ~Observer() {}  

    void initialize(glm::vec3 eye, glm::vec3 center, glm::vec3 upp); 
    void walk(GLfloat distance); 
    void pitch(GLfloat pitch); 
    void yaw(GLfloat yaw); 
    void roll(GLfloat roll); 
    void setView(); 
}; 

void Observer::initialize(glm::vec3 eye, glm::vec3 center, glm::vec3 upp) 
{ 
    this->eye = eye; 
    this->center = center; 
    this->upp = upp; 
} 

void Observer::walk(GLfloat distance) 
{ 
    glm::vec3 vector = glm::normalize(center - eye); 
    glm::vec3 translate = vector*distance - vector; 

    eye += translate; 
    center += translate; 
    upp += translate; 
} 

void Observer::roll(GLfloat roll) { 
    glm::mat4 rotate(1.0f); 

    rotate = glm::rotate(rotate, roll, glm::vec3(center - eye)); 

    center = glm::vec3(rotate * glm::vec4(center, 1.0f)); 
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f)); 
} 

void Observer::yaw(GLfloat yaw) { 
    glm::mat4 rotate(1.0f); 

    rotate = glm::rotate(rotate, yaw, glm::vec3(upp - eye)); 

    center = glm::vec3(rotate * glm::vec4(center, 1.0f)); 
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f)); 
} 

void Observer::pitch(GLfloat pitch) { 
    glm::mat4 rotate(1.0f); 
    glm::vec3 cross = glm::cross(center - eye, upp - eye); 

    rotate = glm::rotate(rotate, pitch, cross); 

    center = glm::vec3(rotate * glm::vec4(center, 1.0f)); 
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f)); 
} 

void Observer::setView() 
{ 
    view = glm::lookAt(eye, center, upp); 
} 

#endif 

Так прямо перед тем, как начинает рисовать что я установил матрицу вида с этим классом в другой части в программе. Может ли кто-нибудь сказать мне, правильны ли мои математики?

ответ

2

Когда вы walk, вы хотите только преобразовать глаз и центральное положение, а не вектор upp. Просто удалите линию upp += translate;.

Смежные вопросы