【问题标题】:Implementing Zoom on an orbit camera在轨道相机上实现缩放
【发布时间】:2011-06-02 23:45:58
【问题描述】:

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

使用如下函数操作相机:

moveCamera(x,y,z);

根据角度,x、y、z 的值应该不同以获得正确的缩放功能,但我想不出办法。

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

在 PigBens 的帮助下,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);

}

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

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

以下是其中两个功能的示例。

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

【问题讨论】:

    标签: c++ camera


    【解决方案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 个来执行此操作。

    【讨论】:

    • 谢谢,我猜它就是这么简单。试图使用毕达哥拉斯来计算相机和目标之间的距离,然后如果我缩小或增加距离,然后计算 x、y、z 的新值。
    • 使用双倍并没有改变缩小错误发生的程度。而且我已经在小范围工作,我在 x、y、z 上的值范围从大约 -20 到 +20,可能从 -50 到 +50 顶部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多