Страница 1 из 1

Как задать пуле нужный угол

СообщениеДобавлено: 19 фев 2019, 18:00
DimaJoke
здравствуйте, насколько этот вопрос не был нубским.. Мне нужно буквально узнать угол между тремя векторами(как на картинке)
Изображение
И вывести это в float переменную, которая будет задавать вращение по оси Z Quaternion.Euler при Instantiate
Перекопал учебники пол линейной алгебре, опробовал функции Vector3.Angle и Vector3.SignedAngle, но... ничего не работает(хм, логично, тогда бы я сюда не писал).

Но пока получается одно из трёх
Изображение Изображение
(в третьем случае угол получается максимум одному)

коды выглядит.. *вырвал часть кода*
Синтаксис:
Используется csharp
Vector3 MousePosition = camera.ScreenPointToRay(Input.mousePosition).origin;

float Angle = (float) Vector3.Angle(MousePosition - transform.position, transform.right - transform.position);

Instantiate(FireBall, transform.position, Quaternion.Euler(0f, 0f, Angle));
 


вот так

Re: Угол между тремя векторами

СообщениеДобавлено: 19 фев 2019, 18:05
Paul Siberdt
Вам нужен не угол между тремя векторами, а угол между векторами ВА и ВС. ВА = А-В, ВС = С-В.

Синтаксис:
Используется javascript
Vector3 vA, vB, vC;
float angle = Vector3.Angle(vA-vB, vC-vB);
 

Re: Угол между тремя векторами

СообщениеДобавлено: 19 фев 2019, 18:16
DimaJoke
Paul Siberdt, спасибо за ответ, но есть небольшая проблема.
Есть погрешность на несколько градусов(для меня критично), если Va оказывается нижу Vc то происходит отражение по оси X (могу решить с помощью условий).
Что делать с погрешностью?

Re: Угол между тремя векторами

СообщениеДобавлено: 19 фев 2019, 18:24
Paul Siberdt
Как я всегда советую: расскажите, какую задачу пытаетесь решить. Не выбранную реализацию, а задачу.

Не могу представить, какую погрешность имеете в виду. Если появляется погрешность - это звоночек, что что-то у вас в коде накожено не то. :)
А править "отражение" можно через Vector3.SignedAngle.

Re: Угол между тремя векторами

СообщениеДобавлено: 19 фев 2019, 18:25
DimaJoke
Paul Siberdt писал(а):Как я всегда советую: расскажите, какую задачу пытаетесь решить. Не выбранную реализацию, а задачу.

Хорошо, спасибо. Новую тему создавать? Или эту перименовывать?(после ответа это сообщение будет отредактировано)

Re: Угол между тремя векторами

СообщениеДобавлено: 19 фев 2019, 18:28
Paul Siberdt
Лучше переименовать, чем плодить новую. А еще лучше - просто продолжить решать проблему. Если под конец решение уже не будет иметь ценности ни для вас, ни для сообщества, тему можно даже удалить.

Вот, я сижу, рефрешу страницу и жду объяснялку, что должно получиться и отчего, вдруг, выскакивают лишние градусы. :) Название темы на это никак не повлияет.

Re: Как задать пуле нужный угол

СообщениеДобавлено: 19 фев 2019, 18:53
Paul Siberdt
Вот, я смотрю на картинку, потом на название "Как задать пуле нужный угол" и ничего не понимаю. :)
Где там пуля и, тем более - углы? :)

Судя по коду, вы читаете позицию мышки на экране и рождаете файерболл с каким-то углом... Вот, и напишите что-то, типа, "я хочу запускать шар, задавая ему стартовую позицию в клике мышки, а направление - в сторону смещения мышки". Так? Нет? Тогда пишите сами, что хотите. :)

Re: Как задать пуле нужный угол

СообщениеДобавлено: 19 фев 2019, 19:56
DimaJoke
Paul Siberlit, именно так.

Re: Как задать пуле нужный угол

СообщениеДобавлено: 19 фев 2019, 20:12
Paul Siberdt
Ок, а игра 2D, верно?
Тогда самое простое, что можно сделать - это посчитать вектор направления между экранными точками Press и Release (все также: vDirectionScreen = vRelease - vPress)
Вам угол вообще не нужен.

Если хотите повернуть файербол по направлению, определите кватернион: Quaternion qDirection = Qiaternion.FromToRotation(vFireballForward, vDirectionScreen)

Re: Как задать пуле нужный угол

СообщениеДобавлено: 21 фев 2019, 21:57
AngryCat
Возможно, следует проверять не сразу, а после небольшой задержки. Это может устранить погрешность

Re: Как задать пуле нужный угол

СообщениеДобавлено: 22 фев 2019, 14:23
1max1
Синтаксис:
Используется csharp
var mp = Camera.main.ScreenToWorldPoint(Input.mousePosition);
var fb = Instantiate(FireBall, transform.position, Quaternion.identity);
fb.LookAt2D(mp, fb.transform.up); // поворот оси up в сторону mp

Синтаксис:
Используется csharp
static class Extensions
{
    public static void LookAt2D(this Transform me, Vector3 target, Vector3 eye)
    {
        Vector3 look = target - me.position;

        float sAngle = Vector2.SignedAngle(eye, look);

        if (sAngle != 0.0f)
        {
            Vector3 eulerAngles = me.eulerAngles;

            eulerAngles.z += sAngle;

            me.eulerAngles = eulerAngles;
        }
    }
}
 

Re: Как задать пуле нужный угол

СообщениеДобавлено: 23 фев 2019, 09:21
DimaJoke
Всем спасибо, Quaternion.FromToRotation() было уже достаточно для решения моей задачи.