Войти
ПрограммированиеФорумОбщее

Unity: Поворот в 2D без углов Эйлера, возможно ?

#0
18:15, 25 окт. 2016

Привет.

Интересует такая вещь: можно ли повернуть объект в плоскости XY не используя углы Эйлера, а обойдясь векторной математикой. Я вот пробую, но что-то у меня не получается.

Заранее спасибо.


#1
18:27, 25 окт. 2016

Попробуй матрицы. Без углов Эйлера. Православные. Хорошие. Детерминант равен единице, собственный вектор с собственным значением 1 направлен по оси Z, два других комлексные.

|cos(a)  sin(a)  0 |
|-sin(a) cos(a)  0 |
|0        0        1  |

#2
18:29, 25 окт. 2016

Это поворот вокруг оcи Z. Quaternion.AngleAxis(angle,Vector3.forward);

#3
21:30, 25 окт. 2016

dave
всё это хорошо, но это же Юнити.. Тут всё построено на кватернионах. Если я не прав, то поясните как воспользоваться Вашим решением.

foxes
угу.. А угол как найти ? Могу только по скалярному произведению найти cos, но вот делать acos совсем не хоцца.

#4
0:03, 26 окт. 2016

Gladiator
> поясните как воспользоваться Вашим решением
Матрица поворота же, на вики всё хорошо расписано

#5
4:44, 26 окт. 2016

Gladiator
> А угол как найти ?
А как ты вообще хочешь поворачивать объект, не зная на сколько ты его повернешь?
Gladiator
> Могу только по скалярному произведению найти cos
вот с этого места по подробней - откуда ты будешь брать скалярное произведение?

#6
5:07, 26 окт. 2016

Gladiator
> всё это хорошо, но это же Юнити.. Тут всё построено на кватернионах.

Кватернионы для двухмерия это комплексные числа:

При перемножении комплексных чисел их модули перемножаются, а аргументы складываются. Если модуль второго сомножителя равен 1, то умножение на него геометрически означает поворот радиус-вектора первого числа на угол, равный аргументу второго числа.

Как в юнити с ними я х/з, не знаю юнити.

#7
11:08, 26 окт. 2016

foxes
> вот с этого места по подробней - откуда ты будешь брать скалярное
> произведение?

Есть некое направление у объекта 2D, есть точка в пространстве, к которой нужно повернуться. Вот и два вектора. Только толку от этого мало, если всё равно надо арккосинус брать. Видел вариант Winnie с Atan2, но пока не разбирался в чём суть.. В любом случае тоже вариант не оч.


=A=L=X=
> При перемножении комплексных чисел их модули перемножаются, а аргументы
> складываются. Если модуль второго сомножителя равен 1, то умножение на него
> геометрически означает поворот радиус-вектора первого числа на угол, равный
> аргументу второго числа.

Хм.. прикольно. А я вот не знаю математическую основу кватернионов. Когда-то помню пытался разобраться, но либо я взял не ту литературу, либо я просто такой тупой, но мне она(мат. основа) показалась очень сложной.

#8
12:31, 26 окт. 2016

Gladiator
там была функция повернуться в направлении вектора, у меня дома в проекте записано, вечером если не забуду скину, а проще сам загугли.

#9
12:57, 26 окт. 2016

Gladiator
> А я вот не знаю математическую основу кватернионов.

Фактически кватернионы это расширение над комплексными числами.
Для комплексных чисел еще можно немного понять что-к-чему.
Фактически комплексные числа в геометрическом смысле совпадают с двумерными векторами ну прямо 1-в-1, кроме операции умножения вектора на вектор.
Комплексное умножение определяется через немного замысловатую комбинацию сумм и вычетов произведений компонент (x,y), в которой сразу же взгляд опытный может заметить некое сходство с развёрткой формул матричных умножений.
Нечто такое там и происходит и результатом является вектор длина которого есть произведение длин векторов исходных, а угол с осью - сумма исходных углов с осями. Собственно это есть ничто иное как поворот вокруг начала координат с масштабированием, если один из векторов принять за "базу вращения".
Ну и собственно если у тебя есть угол alpha на который надо повернуть, то очевидно, что векторная пара "базы поворота" (x, y) это просто ( sin( alpha ), cos( alpha ) ). комплексным умножением на эту величину делаешь поворот. без масштабирования, потому что длина - единица.

#10
22:26, 26 окт. 2016

this.transform.rotation = Quaternion.Euler(вектор) - смотреть в направлении вектора.
у меня так: Quaternion.Euler(0, 0, 180 + Vector3.Angle(Vector3.down, this.Velocity)); (там перегрузка для 3х флоатов есть)

#11
23:31, 26 окт. 2016

Это кошмар конечно какой-то

#12
0:50, 27 окт. 2016

Gladiator
в юнити вращение трансформу можно задать ТОЛЬКО кватернионами или эйлерами.  Что бы ты там не навелосипедил - прийдется создавать первое или второе и его назначать.
Пользуйся Atan2. Он возвращает  угол до точки на 2х мерном пространстве, то есть готовый эйлер.

 
Порядок

this.transform.rotation = Quaternion.Euler(вектор) - смотреть в направлении вектора.

ты че, под спйсом програмируешь, что это за хрень вообще написана, лол?

#13
5:09, 27 окт. 2016

Порядок
> смотреть в направлении вектора.
https://docs.unity3d.com/ScriptReference/Quaternion.LookRotation.html
Gladiator
> в плоскости XY

Quaternion.LookRotation(Vector3.Scale(posTo-posFrom, new Vector3(1, 1, 0)),Vector3.forward);
ПрограммированиеФорумОбщее

Тема в архиве.