我正试图通过鼠标移动来改变相机视图,并希望相机以弧形方式在原点周围移动而不会进入场景;如此圆顶般的景色。
以下工作可以令人满意地获得眼睛坐标并制作半弧球视图。我硬编码了一个条件,以便我无法在场景下查看。这种情况的结果是,相机不会进入场景,而是放大到中心。我无法理解如何阻止相机进行“缩放”。当我到达圆顶视图的最低部分时,我只想向左或向右移动。距离是恒定的。有什么指导吗?
void onMotion(int x, int y) {
camX = distance * -sinf(x*(M_PI / 180)) * cosf((y)*(M_PI / 180));
camY = distance * -sinf((y)*(M_PI / 180));
camZ = -distance * cosf((x)*(M_PI / 180)) * cosf((y)*(M_PI / 180));
if (camY < 4)
camY = 4;
glutPostRedisplay();
}
答案 0 :(得分:2)
您不需要约束生成的坐标,而是输入角度:
4 <= distance * -sin(y)
-4 / distance >= sin(y)
//Assuming y is always between -PI/2 and PI/2
arc sin(-4 / distance) >= y
因此,在开始时请执行以下操作:
double yAngle = y * M_PI / 180;
double yThreshold = std::asin(-4.0 / distance);
if(yAngle > yThreshold)
yAngle = yThreshold;
然后使用yAngle
代替y
。
顺便说一下,从鼠标坐标到角度的映射看起来有点奇怪。我不确定上述公式中的假设是否成立。所以你可能需要调整代码。更好的是,调整计算角度的方式。它应该考虑窗口大小。
答案 1 :(得分:2)
我认为这是因为camY
&lt; camY
&lt; 4.想想相机何时接近球体的南极。您将y坐标设置为4,但x和z仍然靠近轴。
您需要使用新的y coord重新计算所有内容,而不是仅设置camY
变量。您可以将camX
设置为4,然后将camZ
和if (camY < 4)
{
camY = 4;
// Normalize the new vector
mag = sqrt(camX * camX + camY * camY + camZ * camZ);
camX /= mag;
camY /= mag;
camZ /= mag;
// Now push it out to distance
camX *= distance;
camY *= distance;
camZ *= distance;
}
推回到新方向的适当距离。像这样:
curl maps.googleapis.com