在轨道相机上实现缩放

时间:2011-01-03 18:15:13

标签: c++ camera

我希望放大轨道相机的目标。

使用以下功能操作相机:

moveCamera(x,y,z);

根据角度,值x,y,z应该不同,以获得正确的缩放功能,但我无法找到一种方法。

我使用getCameraposxgetTargetposy等函数来获取目标和相机的坐标。

在PigBens帮助之后,Zoom kinda现在可以正常工作,但我遇到了问题。放大是没有问题的,但是在放大太近后,缩小停止工作。而且距离太近我仍然很远。

这是我的缩放功能。

void Camera::orbZoom(bool Zoo)
{
    float x;
        float y;
        float z;
        float xc;
        float yc;
        float zc;
    float zoom;

    x=getTargetposx();
    y=getTargetposy();
    z=getTargetposz();
    xc=getCameraposx();
    yc=getCameraposy();
    zc=getCameraposz();

    xc=xc-x;
    yc=yc-y;
    zc=zc-z;

    if ( ivan==true){
        zoom = 1.02;
        if (xc<1){xc=+1.5;}
        else if (yc<1){yc=+1.5;}
        else if (zc<1){zc=+1.5;}
            xc=xc*zoom;
            yc=yc*zoom;
            zc=zc*zoom;
    }
    if(ivan==false) {
        zoom = 0.98;
    xc=xc*zoom;
    yc=yc*zoom;
    zc=zc*zoom;
    }

    xc=xc+x;
    yc=yc+y;
    zc=zc+z;
    camerapos.assign(xc,yc,zc);

}

好的,所以最后一件事并没有像我在上一篇评论中写的那样。我认为还有其他原因导致这种行为。停止工作的时间限制比相机起始位置或起始位置更接近目标,对此不太确定。但是如果我从缩小开始并且没有比摄像机起始位置更接近它的工作。

我认为错误是在代码的这一部分,但我可能是错的,所以如果有人想看到其他部分只是问。我所有其他相机行为都正常工作。两种模式,轨道和翻滚。俯仰,偏航和滚动适用于两种模式和扫描模式。

以下是其中两个功能。

    void Camera::strafeUp(float distance)
{
    camerapos += upvect * distance;
    targetpos += upvect * distance;
}


void Camera::tumbleYaw(float angle)
{
    Quaternionf rotation((angle*PIdiv180), upvect);
    rightvect = rotation.matrix() * rightvect;
    forwardvect = rotation.matrix() * forwardvect;

    forwardvect.normalize();
    rightvect.normalize();

    targetpos = camerapos + forwardvect * cameralength;
}

1 个答案:

答案 0 :(得分:1)

从相机位置减去目标位置,然后缩放,然后再次添加目标位置。

camera_position -= target_position;
camera_position /= zoom_factor;
camera_position += target_position;

关于你的第二个问题。我的猜测是,这是因为花车缺乏精确度。当你到达某个点时,乘以1.02不足以将浮点值更改为下一个更高的可表示值,因此它根本不会改变。我的测试表明,直到浮点数处于10e-44范围内才会发生这种情况,所以你必须使用一些非常巨大的单位来解决这个问题。一些可能的解决方案。

  1. 使用双打而不是浮点数。你仍然会遇到同样的问题。但是,在更接近缩放之前它不会发挥作用。

  2. 使用较小的单位。我通常只跟1.0 = 1 meter一起去,我从来没有遇到过这个问题。

  3. 执行最大缩放。你实际上会与上面的其他2个结合使用。