Привет.
Интересует такая вещь: можно ли повернуть объект в плоскости XY не используя углы Эйлера, а обойдясь векторной математикой. Я вот пробую, но что-то у меня не получается.
Заранее спасибо.
Попробуй матрицы. Без углов Эйлера. Православные. Хорошие. Детерминант равен единице, собственный вектор с собственным значением 1 направлен по оси Z, два других комлексные.
|cos(a) sin(a) 0 |
|-sin(a) cos(a) 0 |
|0 0 1 |
Это поворот вокруг оcи Z. Quaternion.AngleAxis(angle,Vector3.forward);
dave
всё это хорошо, но это же Юнити.. Тут всё построено на кватернионах. Если я не прав, то поясните как воспользоваться Вашим решением.
foxes
угу.. А угол как найти ? Могу только по скалярному произведению найти cos, но вот делать acos совсем не хоцца.
Gladiator
> поясните как воспользоваться Вашим решением
Матрица поворота же, на вики всё хорошо расписано
Gladiator
> А угол как найти ?
А как ты вообще хочешь поворачивать объект, не зная на сколько ты его повернешь?
Gladiator
> Могу только по скалярному произведению найти cos
вот с этого места по подробней - откуда ты будешь брать скалярное произведение?
Gladiator
> всё это хорошо, но это же Юнити.. Тут всё построено на кватернионах.
Кватернионы для двухмерия это комплексные числа:
foxes
> вот с этого места по подробней - откуда ты будешь брать скалярное
> произведение?
Есть некое направление у объекта 2D, есть точка в пространстве, к которой нужно повернуться. Вот и два вектора. Только толку от этого мало, если всё равно надо арккосинус брать. Видел вариант Winnie с Atan2, но пока не разбирался в чём суть.. В любом случае тоже вариант не оч.
=A=L=X=
> При перемножении комплексных чисел их модули перемножаются, а аргументы
> складываются. Если модуль второго сомножителя равен 1, то умножение на него
> геометрически означает поворот радиус-вектора первого числа на угол, равный
> аргументу второго числа.
Хм.. прикольно. А я вот не знаю математическую основу кватернионов. Когда-то помню пытался разобраться, но либо я взял не ту литературу, либо я просто такой тупой, но мне она(мат. основа) показалась очень сложной.
Gladiator
там была функция повернуться в направлении вектора, у меня дома в проекте записано, вечером если не забуду скину, а проще сам загугли.
Gladiator
> А я вот не знаю математическую основу кватернионов.
Фактически кватернионы это расширение над комплексными числами.
Для комплексных чисел еще можно немного понять что-к-чему.
Фактически комплексные числа в геометрическом смысле совпадают с двумерными векторами ну прямо 1-в-1, кроме операции умножения вектора на вектор.
Комплексное умножение определяется через немного замысловатую комбинацию сумм и вычетов произведений компонент (x,y), в которой сразу же взгляд опытный может заметить некое сходство с развёрткой формул матричных умножений.
Нечто такое там и происходит и результатом является вектор длина которого есть произведение длин векторов исходных, а угол с осью - сумма исходных углов с осями. Собственно это есть ничто иное как поворот вокруг начала координат с масштабированием, если один из векторов принять за "базу вращения".
Ну и собственно если у тебя есть угол alpha на который надо повернуть, то очевидно, что векторная пара "базы поворота" (x, y) это просто ( sin( alpha ), cos( alpha ) ). комплексным умножением на эту величину делаешь поворот. без масштабирования, потому что длина - единица.
this.transform.rotation = Quaternion.Euler(вектор) - смотреть в направлении вектора.
у меня так: Quaternion.Euler(0, 0, 180 + Vector3.Angle(Vector3.down, this.Velocity)); (там перегрузка для 3х флоатов есть)
Это кошмар конечно какой-то
Gladiator
в юнити вращение трансформу можно задать ТОЛЬКО кватернионами или эйлерами. Что бы ты там не навелосипедил - прийдется создавать первое или второе и его назначать.
Пользуйся Atan2. Он возвращает угол до точки на 2х мерном пространстве, то есть готовый эйлер.
Порядок
Порядок
> смотреть в направлении вектора.
https://docs.unity3d.com/ScriptReference/Quaternion.LookRotation.html
Gladiator
> в плоскости XY
Quaternion.LookRotation(Vector3.Scale(posTo-posFrom, new Vector3(1, 1, 0)),Vector3.forward);
Тема в архиве.