Рассчитать угол цели, учитывая текущий угол и положение цели?

Я боролся с тем, что, по моему мнению, должно быть очень простой проблемой:

Схема проблемы,

Я знаю текущий угол направления (скажем, 15 градусов) и, учитывая преобразование объекта gameObject, я хочу вычислить угол, на который я должен повернуться, чтобы повернуться лицом к цели. В приведенном выше примере я хочу рассчитать скажем 335ish град.

Обратите внимание, что мне нужно вычислить целевой угол, у меня есть другой класс, который, учитывая угол, заботится о повороте курса на желаемый угол. Я знаю о Transform.LookAt() и других подобных функциях, они не применяются в этой ситуации, потому что по причинам (в другом классе я в основном вычисляю кватернионы Эйлера и Lerp, пока не достигну целевого угла, из-за ограничений проекта, Transform.LookAt() не работает).

При первом подходе я попытался вычислить угол тета с помощью произведения Dot Vector3.forward и вектора направления, но это не совсем правильно (вращался вечно или в неправильном направлении).

Схема проблемы

targetAngle = Vector3.Angle(Vector3.forward, (target pos - current pos).normalized);

Я подумал, может быть, если бы я мог рассчитать текущий вектор направления курса, я мог бы взять произведение точки на него и вектор направления цели, чтобы получить угол тета, а затем использовать тета и текущий угол, чтобы выяснить целевой угол (360 - тета или что-то в этом роде).?) чтобы получить угол, на который я хочу повернуть. Дело в том, что у меня есть только текущий угол и текущее положение, я не понимаю, как рассчитать текущий вектор направления курса из этой информации. Должен ли я просто добавить некоторую произвольную константу к значению Z текущей позиции и вычесть из нее текущую позицию, чтобы получить вектор dir? Кажется, хак и как это не должно работать.

Схема проблемы

Любые идеи приветствуются.

Изменить: дополнительная информация

Код ориентации / U / Асад спросил о:

    // Calculate the target Quat to rotate all children by
    Quaternion targ = Quaternion.Euler(0, 0, targetAngleHeading);
    // Calculate the Linear interpolation to apply to all children
    Quaternion lerp = Quaternion.Lerp(children[0].transform.localRotation, targ, Time.deltaTime * speedHeading_dps);

    foreach (GameObject c in children)
    {
        // Apply lerp calcualted above to all children
        c.transform.localRotation = lerp;
    }
    // Update the current heading angle 1st child's local z angle
    currentAngleHeading = turrets[0].transform.localEulerAngles.z;

Затем в FixedUpdate() у меня есть:

    if (currentAngleHeading != targetAngleHeading)
    {
        DesiredHeading();
    }

2 ответа

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

Vector3 vectorToTarget = target.transform.position - transform.position;
Vector3 facingDirection = transform.forward; // just for clarity!

float angleInDegrees = Vector3.Angle(facingDirection, vectorToTarget);
Quaternion rotation = Quaternion.FromToRotation(facingDirection, vectorToTarget);

Обратите внимание, что вращение относительно; т. е. это вращение, которое нужно применить из текущей позиции, чтобы быть направленной к цели.

Попробуйте это вместо

Вы можете непосредственно взять вектор расстояния вектора из transform.position и затем vector3.normalize (target.position - object.position)

это угол объекта, который вы хотите переместить

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