第三人称相机循环翻转
Posted
技术标签:
【中文标题】第三人称相机循环翻转【英文标题】:Third person camera flips on loop 【发布时间】:2013-07-12 08:25:19 【问题描述】: float FoV = initialFoV - 5;
//(*it)->getParent()->getPosition() + (*it)->getOrientationQuat() * (*it)->getPosition();
glm::vec3 lookAt = carPosition;
glm::vec3 temp;
temp.x = spaceShip->orientation.y;
temp.y = spaceShip->orientation.x;
temp.z = spaceShip->orientation.z;
glm::vec3 cameraposition = carPosition + glm::quat(temp) * position;
ProjectionMatrix = glm::perspective(FoV, 4.0f / 3.0f, 0.1f, 100.0f);
ViewMatrix = glm::lookAt(
cameraposition, // Camera is here
lookAt, // and looks here : at the same position, plus "direction"
vec3(0, 1, 0) // Head is up (set to 0,-1,0 to look upside-down)
);
如您所见,我们构建了第三人称相机,这台相机正在追逐我们的飞机。但是当我们的飞机进行循环时,相机会在中途翻转。所以一切都是颠倒的。我们如何确保相机不会翻转?
【问题讨论】:
您似乎在限制您的相机始终“启动”。请参阅lookAt 调用。当您的飞机进行循环时,在某些时候,它是颠倒的。您的相机将翻转(而不是 ariplane)以“熬夜”。无法提供更多信息,因为我无法测试您的代码。 成功了,谢谢。 【参考方案1】:我们通过计算而不是设置它来修复它。
glm::vec3 cameraposition = carPosition + glm::quat(temp) * position;
ProjectionMatrix = glm::perspective(FoV, 4.0f / 3.0f, 0.1f, 100.0f);
glm::mat4 RotationMatrix = eulerAngleYXZ(carDirection.x, carDirection.y, carDirection.z);
glm::vec4 up = RotationMatrix * glm::vec4(0,1,0,0);
glm::vec3 up3(up);
ViewMatrix = glm::lookAt(
cameraposition, // Camera is here
lookAt, // and looks here : at the same position, plus "direction"
up3 // Head is up (set to 0,-1,0 to look upside-down)
);
【讨论】:
如果您的相机相对于飞机是固定的,那么简单地获取飞机的矩阵并添加一些偏移量以找到相机的矩阵不是更容易吗? (而不是使用lookAt?)以上是关于第三人称相机循环翻转的主要内容,如果未能解决你的问题,请参考以下文章