Реализация Zoom на орбиту камеры - PullRequest
1 голос
/ 03 января 2011

Я хочу увеличить цель орбитальной камеры.

Камера управляется с помощью такой функции:

moveCamera(x,y,z);

В зависимости от угла значения x, y,z должен отличаться, чтобы получить правильную функцию масштабирования, но я не могу найти способ сделать это.

Я использую такие функции, как getCameraposx, getTargetposy и т. д., чтобы получить координаты для моей цели и камеры..

Zoom вроде работает теперь после помощи PigBens, но я столкнулся с проблемой.Увеличение не является проблемой, но после слишком близкого увеличения масштабирование перестает работать.И со слишком близким я все еще довольно далеко.

Вот моя функция масштабирования.

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 Ответ

1 голос
/ 03 января 2011

Вычтите целевую позицию из положения камеры, затем масштабируйте ее, затем снова добавьте целевую позицию.

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

Относительно вашей второй проблемы.Я предполагаю, что это связано с отсутствием точности в плавающих.Когда вы доходите до определенной точки, умножения на 1,02 недостаточно, чтобы изменить значение с плавающей точкой на следующее более высокое представимое значение, поэтому оно не меняется вообще.Мои тесты показывают, что этого не произойдет до тех пор, пока число с плавающей точкой не окажется в диапазоне 10e-44, поэтому вы должны использовать несколько довольно гигантских единиц, чтобы это стало проблемой.Несколько возможных решений.

  1. Используйте двойные числа вместо плавающих.У вас все еще будет та же проблема.Но он не вступит в игру, пока не станет намного ближе.

  2. Используйте меньшие единицы.Я обычно просто использую 1.0 = 1 meter и никогда не сталкивался с этой проблемой.

  3. Обеспечение максимального увеличения.Вы бы на самом деле сделали это в сочетании с другими двумя выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...