c++ - 在轨道相机上实现缩放

标签 c++ camera

我想放大轨道相机的目标。

使用如下函数操作相机:

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

最佳答案

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

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

关于你的第二个问题。我的猜测是这是由于 float 不够精确。当您下降到某个点时,乘以 1.02 不足以将 float 的值更改为下一个更高的可表示值,因此它根本不会改变。我的测试表明,只有 float 在 10e-44 范围内才会发生这种情况,因此您必须使用一些非常巨大的单位才能成为问题。一些可能的解决方案。

  1. 使用 double 而不是 float 。你仍然会遇到同样的问题。但在更近距离的缩放之前,它不会发挥作用。

  2. 使用较小的单位。我通常只选择 1.0 = 1 米,我从来没有遇到过这个问题。

  3. 实现最大缩放。实际上,您可以结合上面的其他 2 项来执行此操作。

关于c++ - 在轨道相机上实现缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587049/

相关文章:

c# - 在 CLR 中使用托管线程和纤程

c++ - 无法尝试删除不在 C++ 链接列表中的项目

java - 打开网络摄像头并设置为背景(问题)

android - 使用相机拍照时如何找到 getThumbnail 的 origID.TakePicture

c++ - g++4.7.3 和 g++4.8 的 undefined reference ?

c++ - 为什么我必须在输入的末尾输入一个非整数才能结束程序?

android - 捕获的相机图像看起来模糊

swift - 使用相机向 UIPageViewController 添加多个图像

javascript - HTML5 相机在 Tomcat7 中无法工作

c++ - Qt 创建者在 linux 中对 "class::function"的 undefined reference