Найти угол между 2 точками, игнорируя origin.forward в Unity - PullRequest
0 голосов
/ 30 мая 2018

Фон: Я создаю приложение для поиска сокровищ AR.Это просто, у него есть локатор, который говорит вам, где сокровище относительно вас.У меня есть камера, являющаяся источником, а сокровище - объект в мире AR.

Вопрос: Я хотел бы повернуть свою стрелу в соответствии с тем, где в космосе находится сокровище.но в 2д.По сути, я бы проигнорировал относительную прямую плоскость, которая является camera.forward.

Пример: Если поворот камеры установлен по умолчанию, угол можно рассчитать как atan2 (dy, dx).Если камера смотрит прямо вниз, угол составляет atan2 (dz, dx).

То, что я пробовал:

Quaternion lookRot = Quaternion.LookRotation(target.transform.position - origin.transform.position);
Quaternion relativeRot = Quaternion.Inverse(origin.transform.rotation) * lookRot;

Относительное вращение правильное в трехмерном пространстве, но я хотел бы преобразовать его в 2d, игнорируя плоскость camera.forward.Поэтому, даже если сокровище находится перед камерой или позади нее, угол не должен меняться.

Ответы [ 4 ]

0 голосов
/ 06 августа 2018

Отвечая на старый поток, но я боролся с той же проблемой и нашел относительно простое решение:

Проецируйте положение цели (относительно начала координат) на плоскость, определенную вектором впередкамеры.Затем просто поверните к проецируемой точке:

Vector3 diff = target.transform.position - origin.transform.position;
Vector3 projected = Vector3.ProjectOnPlane(diff, Camera.main.transform.forward);
origin.transform.rotation = Quaternion.LookRotation(projected);
0 голосов
/ 31 мая 2018

enter image description here

Хорошо, я надеюсь, что это имеет смысл.Вам понадобится какой-то оператор if, чтобы определить, смотрит ли ваш персонаж вдоль плоскости x, y или z.Надеемся, что на диаграмме ясно, что это за параметры, но если нет.Например, чтобы смотреть в плоскости «х», вращение у должно быть в диапазоне от 45 ° до -45 ° или от 135 ° до -135 °, а вращение по оси z должно быть в диапазоне от 45 ° до -45 ° или между135 ° и -135 °.

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

0 голосов
/ 02 июня 2018

Оказывается, есть очень простой способ получить относительные X и Y цели.

Vector2 ExtractRelativeXY(Transform origin, Transform target) {
    // Get the absolute look rotation from origin to target.
    Quaternion lookRot = Quaternion.LookRotation(target.transform.position - origin.transform.position);
    // Create a relative look rotation with respect to origin's forward.
    Quaternion relativeRot = Quaternion.Inverse(origin.transform.rotation) * lookRot;
    // Obtain Matrix 4x4 from the rotation.
    Matrix4x4 m = Matrix4x4.Rotate(relativeRot);
    // Get the 3rd column (which is the forward vector of the rotation).
    Vector4 mForward = m.GetColumn(2);
    // Simply extract the x and y.
    return new Vector2(mForward.x, mForward.y);
  }

После получения x и y, поверните его в угол, используя angle = atan2(y,x), как предложено как MBo, так иТом.

Это работает, потому что матричные компоненты кватерниона могут быть продемонстрированы в нескольких векторах.Лучшую иллюстрацию можно найти здесь https://stackoverflow.com/a/26724912.

0 голосов
/ 30 мая 2018

Вычислите разницу в координатах x и y, просто вычитая transform.x для одного объекта из transform.x другого объекта и используя тот же процесс для координат y, а затем используйте Mathf.atan (разница в y / разница в x) длярассчитать угол.Затем установите поворот z на этот угол и назначьте поворот x и y тем, чем они уже были.

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