C++ 在轨道相机上实现变焦

C++ 在轨道相机上实现变焦,c++,camera,C++,Camera,我想放大轨道相机的目标 使用如下功能操作相机: moveCamera(x,y,z); 根据角度值x,y,z应该不同,以获得正确的缩放功能,但我不能想出一个方法来做到这一点 我使用的函数有getCameraposx,getTargetposy等。。获取目标和摄像机的坐标 在Pigben的帮助下Zoom现在可以工作了,但我遇到了一个问题。放大没有问题,但放大太近后,缩小停止工作。离得太近了,我还很远 这是我的缩放功能 void Camera::orbZoom(bool Zoo) { flo

我想放大轨道相机的目标

使用如下功能操作相机:

moveCamera(x,y,z);
根据角度值x,y,z应该不同,以获得正确的缩放功能,但我不能想出一个方法来做到这一点

我使用的函数有
getCameraposx
getTargetposy
等。。获取目标和摄像机的坐标

在Pigben的帮助下Zoom现在可以工作了,但我遇到了一个问题。放大没有问题,但放大太近后,缩小停止工作。离得太近了,我还很远

这是我的缩放功能

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

从摄影机位置减去目标位置,然后缩放它,然后再次添加目标位置

camera_position -= target_position;
camera_position /= zoom_factor;
camera_position += target_position;
关于你的第二个问题。我的猜测是,这是由于浮标缺乏精度。当到达某一点时,乘以1.02不足以将浮点值更改为下一个更高的可表示值,因此它根本不会更改。我的测试表明,直到浮点值在
10e-44
范围内,这种情况才会发生,因此您必须使用一些非常庞大的单位,这才是一个问题。一些可能的解决办法

  • 使用双精度浮点数而不是浮点数。你仍然会有同样的问题。但是,在更近距离的放大之前,它不会发挥作用

  • 使用较小的单位。我通常只使用
    1.0=1米
    ,我从未遇到过这个问题

  • 强制执行最大缩放。实际上,您可以将此操作与上面的其他2项结合使用


  • 从摄影机位置减去目标位置,然后缩放它,然后再次添加目标位置

    camera_position -= target_position;
    camera_position /= zoom_factor;
    camera_position += target_position;
    
    关于你的第二个问题。我的猜测是,这是由于浮标缺乏精度。当到达某一点时,乘以1.02不足以将浮点值更改为下一个更高的可表示值,因此它根本不会更改。我的测试表明,直到浮点值在
    10e-44
    范围内,这种情况才会发生,因此您必须使用一些非常庞大的单位,这才是一个问题。一些可能的解决办法

  • 使用双精度浮点数而不是浮点数。你仍然会有同样的问题。但是,在更近距离的放大之前,它不会发挥作用

  • 使用较小的单位。我通常只使用
    1.0=1米
    ,我从未遇到过这个问题

  • 强制执行最大缩放。实际上,您可以将此操作与上面的其他2项结合使用


  • 谢谢,我猜就这么简单。我试着用毕达哥拉斯来计算相机和目标之间的距离,然后如果我缩小或增加了距离,那么就计算出x,y,z的新值。使用double double并没有改变缩小误差发生的距离。我已经在小范围内工作了,我在x,y,z上的值在-20到+20之间,也许在-50到+50之间。谢谢,我猜这就是这么简单的事情。我试着用毕达哥拉斯来计算相机和目标之间的距离,然后如果我缩小或增加了距离,那么就计算出x,y,z的新值。使用double double并没有改变缩小误差发生的距离。我已经在小范围内工作了,我在x,y,z上的值在-20到+20之间,也许在-50到+50之间。