相机在球体周围运动

时间:2014-12-06 23:28:59

标签: c++ opengl 3d camera

我正在尝试将围绕xz平面的移动转换为围绕球体移动。最初,我让我的相机在y轴上以恒定的高度以恒定速度向前移动。用户可以通过调整偏航来向左/向右移动,但是它们不能向上/向下移动或滚动。以下是我完成的工作:

float turnRate = 1.0;
float stepDist = 0.1;
if (keys['d']) {
    yaw += M_PI * (turnRate / 180.0);
}
if (keys['a']) {
    yaw += M_PI * (-turnRate / 180.0);
}
position.x += stepDist * sinf(yaw);
position.z += stepDist * cosf(yaw + M_PI);

...

glm::mat4 P = glm::rotate(pitch, glm::vec3(-1.0, 0.0, 0.0));
glm::mat4 Y = glm::rotate(yaw, glm::vec3(0.0, -1.0, 0.0));
glm::mat4 T = glm::translate(position);
glm::mat4 C = T * Y * P;

这对我很有用。现在我想要实现的不是在xz平面上移动,而是想要穿过球体的表面。我仍然希望以恒定的半径从球体中心向前移动,只允许调整偏航。这就是我目前所拥有的:

float turnRate = 1.0;
float stepDist = 0.01;
step += stepDist;
if (keys['d']) {
    yaw += M_PI * (turnRate / 180.0);
}
if (keys['a']) {
    yaw += M_PI * (-turnRate / 180.0);
}
pitch = M_PI / 8.0; // angle the camera down towards the sphere a bit
glm::vec3 f = glm::vec3(sinf(yaw), 0.0, cosf(yaw + M_PI));
glm::vec3 up = glm::vec3(0.0, 1.0, 0.0);
glm::vec3 forward = glm::normalize(f);
right = glm::cross(up, forward);

float sphereRadius = 50.0;
float camRadius = sphereRadius + 8.0;
radius = glm::vec3(0.0, camRadius, 0.0);

...

glm::mat4 P = glm::rotate(pitch, glm::vec3(-1.0, 0.0, 0.0));
glm::mat4 Y = glm::rotate(yaw, glm::vec3(0.0, -1.0, 0.0));

glm::mat4 T = glm::translate(radius);
glm::mat4 S = glm::rotate(step, right);
glm::mat4 C = S * T * Y * P;

当相机只是向前移动时,这是有效的。然而,问题在于当偏航改变(用户向右/向左转)并且步骤达到特定值时,球体将开始在相机下方的错误方向上旋转。它不是即时开关。当步长在PI到2PI的增量之间时(似乎在pi和2pi,3pi和4pi等之间反转),它似乎是相反的。)

关于我如何解决这个问题或我做错了什么的任何想法?

更新:
这是我想要实现的类似例子:
http://www.youtube.com/watch?v=izVtTcq_his&t=0m23s
除了我希望能够以小于90度的间隔旋转相机。如果有人有任何关于如何实现这一目标的示例代码/教程的链接,我将非常感激。

0 个答案:

没有答案