2016-02-13 113 views
0

我想旋转相机使用quarternions,但我有问题做它。旋转相机looknt点与quarternions

我现在注意到的第一件事是,当我执行此操作时,Camera Position和Camera LookAt几乎相同,在某些情况下它们是相同的,然后我得到精度问题以及与其相关的所有其他问题。尝试并移动相机。

if (Input::getInstance()->isMouseDown(SDL_BUTTON_RIGHT-1)){ 
     //log_.debug("Camera Mouse Left down"); 
     glm::vec2 mouseDelta = glm::ivec2(oldX, oldY) - Input::getInstance()->getMousePosition(); 
     glm::quat q1 = glm::quat(glm::vec3(glm::radians(mouseDelta.y), glm::radians(mouseDelta.x), 0.0f)); 
     cameraLook_ = q1 * (direction * mouseSensitivity_) * glm::conjugate(q1) + cameraPosition_; 
     //cameraLook_ = glm::rotate(cameraLook_, mouseDelta.x * delta, glm::vec3(0,1,0)); 
     //cameraLook_ = glm::rotate(cameraLook_, mouseDelta.y * delta, glm::vec3(0, 0, 1)); 
} 

回答

0

我转回到我的解决方案的矩阵,因为对我来说他们现在更容易处理。

有几件事情我需要了解有关quarternions,然后我可以解决我的老问题。

glm::mat4 rotationMatrix = glm::translate(cameraPosition_ - glm::vec3(1.0)); 
    rotationMatrix *= glm::rotate(mouseDelta.x, glm::vec3(0, 1, 0)); 
    rotationMatrix *= glm::rotate(mouseDelta.y, glm::vec3(0, 0, 1)); 
    rotationMatrix *= glm::translate(-cameraPosition_ + glm::vec3(1.0)); 
    cameraLook_ = glm::vec3(rotationMatrix * glm::vec4(cameraLook_, 1.0f));