Сверху вниз фокус камеры с углом

Я делаю игру сверху вниз с камерой под углом 40 градусов. Что я хочу сделать, так это когда я щелкаю игровой объект, он перемещает камеру и помещает объект с левой стороны от центра обзора камеры независимо от его вращения. Так что я могу разместить меню на правой стороне. Как получить смещение камеры под углом, чтобы объект находился в средней левой части обзора камеры?

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

transform.position = Vector3.Lerp(transform.position, new Vector3(target.transform.position.x, transform.position.y, target.transform.position.z), 0.1f);

введите описание изображения здесь

1 ответ

Решение

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

В вашем случае это может быть упрощено до 2D-Space:

точка P вы ищете

Не должно быть трудно найти тот.

  1. использование transform.forward камеры, чтобы получить вектор (Vector3 cameraDir) направления, на которое смотрит ваша камера

  2. Повернуть на horizontal fov / 4 вокруг оси у:

Vector3 cameraDirRotated = Quaternion.AngleAxis(hFov/4f, Vector3.up) * cameraDir;

введите описание изображения здесь

  1. -cameraDirRotated будет вектор из куба в точку P, которую вы ищете, вы также можете масштабировать ее:Vector3 PtoMoveTo = cube.transform.position - cameraDirRotated.normalized * 5f;

Полный:

Vector3 FindCameraTarget(Transform targetObj, float hFov)
{
    Vector3 cameraDir = transform.forward;
    Vector3 cameraDirRotated = Quaternion.AngleAxis(hFov / 4f, Vector3.up) * cameraDir;
    Vector3 target = targetObj.transform.position - cameraDirRotated.normalized * 5f;
    return target;
}

Затем:

transform.position = Vector3.Lerp(transform.position, FindCameraTarget(target, 90f) , 2f * Time.deltaTime);

Для производительности вы можете сохранить этот целевой вектор один раз, если куб не движется. Поиск в интернете, как точно считать горизонтальные поля. Умножьте скорость на Time.timeDelta, если вы скачали в Update().

Другие вопросы по тегам