2017-11-11 161 views
3

我试图改变与鼠标移动摄像机视图,并希望相机围绕原点移动在轨迹球的方式没有现场去下;这种类似圆顶的景观。轨迹球相机变焦

的用于获取眼坐标,使这个半轨迹球视图令人满意以下工作。我对条件进行了硬编码,以便在场景下无法查看。这种情况的后果是,相机不是在场景下进行拍摄,而是将相机放大。我无法围绕如何阻止相机进行这种“缩放”。当我到达圆顶视图的最低部分时,我只想向左或向右移动。距离是恒定的。任何指导?

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

距离是否改变了?或者,如果不是,你的视野是否在变化?这也可能导致缩放效果。 – user1118321

+0

@ user1118321,没有距离是静态的。我如何检查FOV是否正在改变? – rafvasq

+1

视野由投影矩阵控制。如果它正在改变,它可能会产生缩放效果。 – user1118321

回答

2

我认为这是由于以下事实造成的:camY < 4.考虑摄像机接近球体的南极。您将y坐标设置为4,但x和z仍然靠近坐标轴。

而不是仅仅设置camY变量,你需要重新计算与新的y坐标一切。您可以设置camY到4,然后按camXcamZ回到正确的距离,在新的方向。类似这样的:

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

顺便说一句,从鼠标的贴图坐标角度似乎有些奇怪。我不确定上述公式中的假设是否成立。所以你可能需要修改代码。更好的是,改变你计算角度的方式。它应该考虑窗口大小。