使用glm :: Quat(ernions)模拟gluLookAt

时间:2014-01-17 03:54:12

标签: c++ opengl quaternions glm-math glulookat

我一直试图模仿gluLookAt功能,但是使用Quaternions。我的每个游戏对象都有一个TranslationComponent。此组件存储对象的位置glm::vec3),轮换glm::quat)和比例({{1} })。相机计算其位置,每个刻度执行以下操作:

glm::vec3

这个位置代码按照操作的方式工作,相机位于播放器后方3米处,距离1米。现在,相机的Quaternion设置如下:

// UP = glm::vec3(0,1,0); 
//FORWARD = glm::vec3(0,0,1);
cameraPosition = playerPosition - (UP * distanceUP) - (FORWARD * distanceAway);

渲染引擎现在获取这些值并生成ViewMatrix(相机)和ModelMatrix(播放器),然后渲染场景。代码如下所示:

//Looking at the player's feet  
cameraRotation = quatFromToRotation(FORWARD, playerPosition); 

quatFromToRotation(glm :: vec3 from,glm :: vec3 to)定义如下:

 glm::mat4 viewTranslationMatrix = 
         glm::translate(glm::mat4(1.0f), cameraTransform->getPosition());
 glm::mat4 viewScaleMatrix = 
         glm::scale(glm::mat4(1.0f), cameraTransform->getScale());
 glm::mat4 viewRotationMatrix = 
         glm::mat4_cast(cameraTransform->getRotation());

 viewMatrix = viewTranslationMatrix * viewRotationMatrix * viewScaleMatrix;

我遇到的麻烦是cameraRotation没有正确设置。无论玩家在哪里,相机的前进总是(0,0,-1)

1 个答案:

答案 0 :(得分:1)

你的问题在

//Looking at the player's feet  
cameraRotation = quatToFromRotation(FORWARD, playerPosition);

你需要从摄影机位置到玩家的脚 - 而不是从“玩家上方一米”看(假设当你最初这样做时玩家在(0,0,0)) )。将FORWARD替换为cameraPosition

cameraRotation = quatToFromRotation(cameraPosition, playerPosition);

编辑我相信您的quatToFromRotation功能也有错误。有关四元数旋转的非常好的解释(以及一些伪代码),请参阅https://stackoverflow.com/a/11741520/1967396