2014-12-09 2 views
0

Im делает упражнения в конце этого урока: LinkСоздать камеру, которая вращается вокруг объекта OpenGL C++

Однако Im застрял на «Создать камеру, которая вращается вокруг объекта»

(position = ObjectCenter + (radius * cos(time), height, radius * sin(time))); 

Я использовал приведенный выше код, подаваемый создать следующий поворот

GLfloat radius = 10.0f; 
position = glm::vec3(0.0f,0.0f,0.0f) + glm::vec3(radius * cos(glfwGetTime()), 0.0f, radius * sin(glfwGetTime())); 

Используя эту сцену, она вращается вокруг (0,0,0) на расстоянии 10, что, по моему мнению, является центром куба, однако это не так, поэтому куб медленно мигает мимо окна так часто, как поворачивается сцена.

Как я могу найти центр объекта? Я не понимаю из кода, когда я рисую куб, где я говорю, чтобы он центрировал его.

Для справки начальное положение VEC является

glm::vec3 position = glm::vec3(0, 0, 5); 
+0

Вы делаете глобальное вращение вместо локального вращения. Вам необходимо переместить камеру в локальное пространство относительно проигрывателя, умножив камеру на обратную позицию игроков. Затем примените свое вращение. – user2970916

+0

или поверните объект на месте –

+0

Редактировать: позиция игрока ==> локальная матрица игрока – user2970916

ответ

0

Самый простой вы можете сделать, это добавить следующее в controls.cpp и объявить его в controls.hpp

glm::vec3 *getPosition(){ 
    return &position; 
} 
void setPosition(glm::vec3 var){ 
    position = var; 
} 

Затем вы должны объявить только следующие переменные в начале основного цикла:

float rotCamera = 0.0f; 
glm::vec3 origPos = *getPosition(); 

и добавить следующие строки сразу после glfwPollEvents(); в основном цикле:

// Swap buffers 
glfwSwapBuffers(window); 
glfwPollEvents(); 

//To rotate the camera through the object 
if (glfwGetKey(window, GLFW_KEY_C) == GLFW_PRESS){ 
    rotCamera += 0.01; 
    glm::vec3 rot(cos(rotCamera) * 10.0 - origPos.x, 0, sin(rotCamera) * 10.0 - origPos.z); 
    setPosition(origPos + rot); 
} 

Наконец, если вы хотите, чтобы камера смотрит в кубе все время, вы должны изменить LookAt от controls.cpp смотреть всегда на (0,0,0):

ViewMatrix  = glm::lookAt(position,   // Camera is here 
           glm::vec3(0, 0, 0), //To look always to the cube 
           up     // Head is up (set to 0,-1,0 to look upside-down) 
          ); 
Смежные вопросы