我一直试图模仿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)
答案 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。