Unity: Как сориентировать камеру по касательной плоскости к сфере? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть камера, которая вращается вокруг земного шара. Находясь на орбите земного шара, пользователь может щелкнуть другие объекты, что приведет к тому, что камера будет вращаться вокруг этого объекта. Итак, с самого начала это выглядит так:

enter image description here

После нажатия на объект камера переместится, чтобы сфокусироваться на нем, но останется в любом местеповорот был заранее, например, так:

enter image description here

Тем не менее, я хотел бы, чтобы камера ориентировалась на то, чтобы глобус всегда был нанижняя часть кадра, как будто она смотрит вдоль касательной плоскости (думаю?). Примерно так.

enter image description here

И то, что видит игрок, сродни этому.

enter image description here

Я приношу извинения за свои художественные способности.

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

Вот так выглядит мой код прямо сейчас:

Vector3 a = target.position;
Vector3 b = earth.transform.position;
Vector3 c = north.transform.position;
Vector3 side1 = b - a;
Vector3 side2 = c - a;
Vector3 tangent = Vector3.Cross(side1, side2);
transform.LookAt(tangent);

"цель" - это астероид или любой объект, вокруг которого вращается камера. «земля» - это глобус, а «север» - игровой объект с центром на Северном полюсе. Этот скрипт прикреплен к камере. Прямо сейчас это просто заставляет камеру ориентироваться различными способами, для которых я не могу точно определить шаблон.

1 Ответ

0 голосов
/ 15 октября 2019

LookAt занимает абсолютную мировую позицию Vector. Вы проходите в направлении Vector, возвращаемом Vector3.Cross, что не совсем то, что вы хотите.


Я бы просто дал объекту Sphere a SphereCollider (если у него его нет в любом случае).

Тогда на камере вы можете получить сценарий, используя Collider.ClosestPoint и использовать целевую позицию в качестве ориентира.

Эту позицию вы можете затем перейти в LookAt

что-то вроде

public Collider sphereCollider;

public void LookAtTarget(Transform target)
{
    var position = sphereCollider.ClosestPoint(target.position);

    transform.LookAt(position);
}

Это должно центрировать Камеру на точке точно "под" целевым объектом на поверхности Сферы, таким образомчто поверхность сферы заполняет половину экрана.

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