Arcball相机缩放

时间:2017-11-11 06:34:20

标签: c opengl camera

我正试图通过鼠标移动来改变相机视图,并希望相机以弧形方式在原点周围移动而不会进入场景;如此圆顶般的景色。

以下工作可以令人满意地获得眼睛坐标并制作半弧球视图。我硬编码了一个条件,以便我无法在场景下查看。这种情况的结果是,相机不会进入场景,而是放大到中心。我无法理解如何阻止相机进行“缩放”。当我到达圆顶视图的最低部分时,我只想向左或向右移动。距离是恒定的。有什么指导吗?

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();
}

2 个答案:

答案 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,然后将camZif (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