我在使用下面的代码限制相机俯仰角(-90º 和 90º 之间)时遇到了一个大问题。这在某种程度上是对这个问题的跟进。
问题似乎在于相机旋转超过 -90º 或超过 +90º,当发生这种情况时,我会向下(或向上)看,但视图只是围绕 Y 轴旋转了 180º。
示例:我朝北看地平线,我开始往下看,直到我不能再往下看(受以下代码限制)。然后我开始抬头,我将面向南方。
void Camera::Rotate(Vector3D angle) {
angle = angle * CAMERA_ROTATION_SPEED;
accumPitchAngle += angle.x;
if(accumPitchAngle > 90.0f) {
angle.x = 90.0f - (accumPitchAngle - angle.x);
accumPitchAngle = 90.0f;
}
if(accumPitchAngle < -90.0f) {
angle.x = -90.0f - (accumPitchAngle - angle.x);
accumPitchAngle = -90.0f;
}
// Rotate along the WORLD_SKY_VECTOR axis (yaw/heading rotation)
// WORLD_SKY_VECTOR = (0.0f, 1.0f, 0.0f)
if(angle.y != 0.0f) {
Reference = RotateArbitraryAxis(Reference, WORLD_SKY_VECTOR, angle.y);
RightVector = Vector3D::CrossProduct(Reference, WORLD_SKY_VECTOR);
UpVector = Vector3D::CrossProduct(RightVector, Reference);
}
// Rotate along the x axis (pitch rotation)
if(angle.x != 0.0f) {
Reference = RotateArbitraryAxis(Reference, RightVector, angle.x);
UpVector = Vector3D::CrossProduct(RightVector, Reference);
}
// Makes sure all vectors are perpendicular all the time
Reference.Normalize();
RightVector = Vector3D::CrossProduct(Reference, UpVector);
RightVector.Normalize();
UpVector = Vector3D::CrossProduct(RightVector, Reference);
UpVector.Normalize();
}
Vector3D Camera::RotateArbitraryAxis(const Vector3D v, Vector3D u, double angle) {
Vector3D result;
u.Normalize();
double scalar = Vector3D::DotProduct(v, u);
double c = cos(Math::DegreesToRadians(angle));
double s = sin(Math::DegreesToRadians(angle));
double a = 1.0f - c;
result.x = u.x * scalar * a + (v.x * c) + ((-u.z * v.y) + (u.y * v.z)) * s;
result.y = u.y * scalar * a + (v.y * c) + (( u.z * v.x) - (u.x * v.z)) * s;
result.z = u.z * scalar * a + (v.z * c) + ((-u.y * v.x) + (u.x * v.y)) * s;
return result;
}
问题可能出在if(angle.y != 0.0f)
语句中,如果我注释该代码块,则根本不存在问题。它与 有一些关系WORLD_SKY_VECTOR
,但该代码是这样的,以允许我旋转航向并保持相机水平。如果我改用了UpVector
,问题就解决了。但这仅对飞行模拟器有好处,我需要保持水平线,这就是背后的原因WORLD_SKY_VECTOR
。但是,当我将相机直接朝下时,这似乎是“侧面切换”的原因。
根据下面评论的要求...这是针对第一人称(和第三人称,但我还没有开始实施该部分)相机,当我直视时,-90º(或直视,+90º)和当角度从 -89º 到 -91º(或从 +89º 到 +91º)时,我希望相机能够防止这种情况发生并且不要超出 -90º、+90º 的限制。当它达到该限制时,我需要相机能够返回(如果我处于 -90º 则向上或如果我处于 +90º 则向下)。现在这只有时有效,其他时候我会面向另一个方向,而不是我最初看的方式。