Рассчитать угол цели, учитывая текущий угол и положение цели?
Я боролся с тем, что, по моему мнению, должно быть очень простой проблемой:
,
Я знаю текущий угол направления (скажем, 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)
это угол объекта, который вы хотите переместить