2015-07-23 5 views
3

Я боролся с тем, что, по моему мнению, должно быть очень простой проблемой:Рассчитать угол мишени при заданном угле и заданном положении?

Diagram of the problem.

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

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

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

Diagram of the problem

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

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

Diagram of the problem

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

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(); 
    } 
+0

Это в 2D? Если нет, вам нужен единичный вектор, указывающий ваш текущий подшипник, а не скалярный угол, равный 15 град. –

+0

Кроме того, это поможет, если вы продемонстрируете, что ваш код делает с углом, который вы вычисляете. Вы правильно вычисляете угол между '(0, 0, 1)' и желаемым заголовком. Вы уверены, что ваш код вращения также интерпретирует угол, предоставленный относительно '(0, 0, 1)'? –

+0

Комментарий «* не работает правильно (повернуто навсегда или в неправильном направлении) *», а также доказательства ваших диаграмм, настоятельно предлагает, чтобы вы не были осторожны с вашими знаками. Математика, которую вы описываете, должна быть правильной и почти тривиальной для реализации; о единственном худшем, вы ** можете ** сделать неправильно, чтобы смешать ваши знаки, –

ответ

0

попробовать это вместо

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

это угол object'll хочет двигаться

+0

Что? Нормализация target.pos - object.pos - это вектор направления, который не дает мне угол ... – Murkantilism

1

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

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); 

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

+0

Правильно, я пробовал, что это последний шаг в моем первом подходе. Я просто передаю угол в градусах к другому классу, который обрабатывает то, что вы сказали в последнем предложении, т. Е. Применяя поворот от текущей позиции до заданного угла в градусах. Я пересматриваю этот подход, возможно, я сделал глупую ошибку где-то – Murkantilism

+0

Mmk, поэтому после повторного внедрения первого подхода я заметил небольшую ошибку. Я использовал Vector3.forward вместо детей [0] .transform.forward. Исправив это, рассчитанный угол был точно противоположным тому, что я хотел, поэтому я добавил 180 и по модулю 360, чтобы получить правильный угол поворота. Другое дело, если я хочу постоянно или, по крайней мере, очень регулярно пересчитывать их (скажем, поворачиваться в сторону движущейся цели или вращаться во время движения, или и то и другое) любые предложения о том, что мне нужно изменить или сделать? – Murkantilism

+0

Если вы хотите повернуть плавно (т. Е. Над несколькими кадрами), вам нужно посмотреть на Quarterion.Lerp или Quarterion.Slerp. Все это достаточно быстро, что вы можете пересчитать каждый кадр (при условии, что у вас нет миллиона одновременно!). Если ваш угол был противоположным, возможно, вы вычисляли значение 'vectorToTarget' назад. –

Смежные вопросы