Я боролся с тем, что, по моему мнению, должно быть очень простой проблемой:Рассчитать угол мишени при заданном угле и заданном положении?
.
Я знаю текущий угол заголовка (скажем, 15 град.), И, учитывая преобразование цели gameObject, я хочу рассчитать угол, который должен вращать в направлении к цели. В приведенном выше примере я хочу рассчитать значение 335ish deg.
Обратите внимание, что мне нужно вычислить цель angle, у меня есть еще один класс, который, учитывая угол, позаботится о том, чтобы поворот заголовка был под нужным углом. Я знаю Transform.LookAt() и другие подобные функции, они не применяются в этой ситуации, потому что причины (в другом классе я в основном рассчитываю Эйлер Кватернион и Лерп, пока не достиг целевого угла из-за ограничений проекта , Transform.LookAt() не работает).
В первом подходе, я попытался вычисления угла тета с продуктом точечного Vector3.forward и вектора направления, не совсем правильно работать (или вращаться вечно или в неправильном направлении)
targetAngle = Vector3.Angle(Vector3.forward, (target pos - current pos).normalized);
Я подумал, что если я мог рассчитать текущий вектор направления движения, я мог бы взять продукт Dot того, что и вектор целевого направления, чтобы получить угол тета, а затем использовать тета и текущий угол, чтобы выяснить цель угол (360 - тета или somethi ng?), чтобы получить угол, в который я хочу повернуть. Дело в том, что у меня только текущий угол и текущий pos, я не понимаю, как вычислить текущий вектор направления курса из этой информации. Добавляю ли я некоторую произвольную константу в значение Z текущей позиции и вычитаю из текущей позиции, чтобы получить вектор dir? Кажется взломанным и, как будто он не должен работать.
Любые идеи приветствуются.
Edit: Дополнительная информация
Ориентация код/и/Асад вопрос о:
// 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();
}
Это в 2D? Если нет, вам нужен единичный вектор, указывающий ваш текущий подшипник, а не скалярный угол, равный 15 град. –
Кроме того, это поможет, если вы продемонстрируете, что ваш код делает с углом, который вы вычисляете. Вы правильно вычисляете угол между '(0, 0, 1)' и желаемым заголовком. Вы уверены, что ваш код вращения также интерпретирует угол, предоставленный относительно '(0, 0, 1)'? –
Комментарий «* не работает правильно (повернуто навсегда или в неправильном направлении) *», а также доказательства ваших диаграмм, настоятельно предлагает, чтобы вы не были осторожны с вашими знаками. Математика, которую вы описываете, должна быть правильной и почти тривиальной для реализации; о единственном худшем, вы ** можете ** сделать неправильно, чтобы смешать ваши знаки, –