Я хочу переместить камеру ближе к объекту в Unity, чтобы масштабирование было линейным. Обратите внимание на масштабирование окна Scene в редакторе Unity. Камера не движется с постоянной скоростью. Чем больше вы увеличены, тем медленнее движется камера. И я действительно хочу переместить камеру, я не хочу менять угол обзора.

0
edvinHolm 27 Дек 2015 в 21:47

3 ответа

Лучший ответ

Во-первых, да, не используйте для этого FOV, было бы очень сложно контролировать движение. Нахождение в низком поле зрения будет означать, что вы сосредоточены на крошечной части, и движение будет трудно контролировать, поскольку одна единица будет большим движением в маленьком поле зрения. Кроме того, большой угол обзора создает эффект рыбьего глаза. Так что нет.

Один из способов добиться такого эффекта от быстрого к медленному - использовать расстояние для определения количества движения.

Допустим, вы используете колесо мыши для увеличения и уменьшения масштаба, вы слушаете значение и создаете движение на его основе.

float movement = Input.GetAxis("Mouse ScrollWheel");
if(movement == 0) 
{
    return;
}
Transform camTr = Camera.main.transform;
float distance = Vector3.Distance(camTr.position, origin.position) + 1;
camTr.Translate(camTr.forward * distance * movement * Time.deltaTime * speed);

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

Положение источника должно быть определено, оно может быть основано на лучевом касте, идущем вперед от камеры и достигающем y = 0. Просто идея. Это также может быть сфокусированный объект, все зависит от того, что вы делаете.

Все дело в том, что ваша камера будет двигаться быстрее, если вы находитесь далеко от точки фокусировки. Кроме того, вы можете ограничить движение, чтобы начало движения с большого расстояния не приводило к гигантскому движению.

2
Everts 28 Дек 2015 в 12:56

Предлагаю использовать FOV (потому что игрок чувствует себя хорошо)
1- используйте Transform.localPosition, чтобы изменить расстояние до камеры на ближнее или дальнее - вы должны изменить ось z на изменение расстояния до камеры
2- использовать визуализацию текстуры камеры и изменить ее масштаб в графическом интерфейсе (это нехорошо, потому что нужна лицензия Pro Unity и выделение памяти);

но не могу знать, по какой причине вы хотите забыть об изменении поля зрения

0
Community 20 Июн 2020 в 09:12

Один шаг перспективной проекции точки - это деление на расстояние до этой точки. Это означает, что проецируемый размер любого объекта не изменяется линейно с его расстоянием.

projectedSize = originalSize / distance

Поэтому, если вы хотите приблизиться к объекту так, чтобы его проекционный размер увеличивался линейно, вам придется нелинейно изменить расстояние.

Мы делаем это, также разделив расстояние на некоторое значение f. Точное значение f зависит от stepSize и (я думаю) поля зрения вашей камеры.

Используя FixedUpdate () вместо Update (), мы гарантируем, что у нас есть постоянный stepSize, который позволяет нам также считать постоянным f.

void FixedUpdate()
{
    newDistance = oldDistance / f;
}

Для определения f вы можете использовать любое значение больше, но близкое к 1. Например, f = 1.01f. Это довольно хорошо приблизит желаемое поведение. Если вы хотите, чтобы он был абсолютно линейным, вам придется глубже погрузиться в вычисления, лежащие в основе перспективной проекции, и вычислить точное значение f самостоятельно: https://en.wikipedia.org/wiki/3D_projection#Perspective_projection

0
Thomas Hilbert 28 Дек 2015 в 12:54