Войти
ПрограммированиеФорумГрафика

И опять эти кватернионы(((... (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
12:12, 6 апр. 2018

Eugene
> Тут надо понять, чо ты вообще хочешь.
> Когда корабль задирает морду на 90 градусов вверх, как должно работать
> рысканье?
> Разумеется, корабль "завалится набок" при стандартной реализации.
Да, должен заваливается. И именно это мне и нужно, так и было у меня с накапливаемой матрицой. Но при тангаже отличном от нуля заваливание идет относительно глобальной системы,, то есть я начинаю горизонтальный поворот и для всего мира мой корабль начинает заваливаться на бок, но в моем окне вида (в кабине) при этом все пролетает строго горизонтально в бок. Именно это я и хочу, именно так и было. Но сейчас при ненулевом тангаже  я начинаю горизонтальный разворот и у меня начинает плавать туда сюда ось вверх  (и вправо соответственно). И в какой-то момент корабль вообще переворачивается на 180 градусов и движение влево превращается в движение вправо.


#31
12:20, 6 апр. 2018

Bald
Трансформация твоего корабля — T[ransform]*R[otation]*vector
Камера классическая — X+ right, Y+ up, Z+ eye.
Yaw — R := R * QuaternionFromEuler(0, angle, 0)
Pitch — R := R * QuaternionFromEuler(angle, 0, 0)
Roll — R := R * QuaternionFromEuler(0, 0, angle)
Может я что-то упускаю, но [мне кажется,] контроллер для космического корабля — одна из самых простых вещей в мире.

#32
13:51, 6 апр. 2018

Bald
Если у тебя поворот происходит относительно глобальной системы вместо локальной, то ты просто не с той стороны умножаешь.
Если же творится какая-то хрень, то, скорее всего, ты налажал с математикой. У тебя кватернионы из библиотеки или самописные?

Eugene
> QuaternionFromEuler
Лучше б такой функции не было, гораздо меньше проблем возникало бы.
Кватернионы должны создаваться либо из (нормированной) оси и угла, либо из угловой скорости, умноженной на время.

#33
14:07, 6 апр. 2018

}:+()___ [Smile]
> Лучше б такой функции не было, гораздо меньше проблем возникало бы.
Нормальная функция-shortcut, не надо только совать ее куда попало.

#34
15:24, 6 апр. 2018

Опять?

В который раз, кватернионом задается только один мать его поворот. Через кватернионную математику невозможно обеспечить все нужды скелетной анимации.
Что такое скелетная анимация? Каждая кость, для пришитых к ней вершин, может задать следующие преобразования:
1) Перенос вершины на произвольное расстояние (translate)
2) Поворот вершины относительно точки соединения кости (rotate)
3) Масштабирования вдоль вектора от точки соединения кости до самой вершины (scale)

Особые ценители могут вывернутся с двумя кватернионами для пункта 1 и 2. Но их математика будет переполнена излишними преобразованиями. И все только для того, чтобы сохранить саму идею

А вот с пунктом 3, все уже рушится к чертям.

Стоит еще добавить, что конечное преобразование для каждой кости - это суперпозиция преобразований данной кости и её родительской кости. Т.е. получается дерево, в котором, чтобы получить конечное значение для листа графа - нужно учитывать все значения по иерархии от этого листа до корня дерева.
И тут ваши кватернионы уже мирно курят в стороне. И для этого очень подходят матрицы 4x4, т.к. это все аффинные преобразования, которые очень удобно соответствуют операции умножения матриц.

Поэтому кватернион обычно и приводят к матрице 4x4 с нулями в 4-м столбце и 4-й строке и единицей в элементе [3][3] (нумерация начинается с нуля).

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

#35
15:43, 6 апр. 2018

Deamon
Да откуда ты взял скелетную анимацию?

> Но он никак не подходит для хранения промежуточных и конечных значений в коде
> движка.
Единственный ФАТАЛЬНЫЙ НЕДОСТАТОК трансформации в виде тройки (vector, quaternion, scalar) в том, что нельзя хранить неюниформные масштабирования и неортогональные преобразования типа скоса.
При этом для внешней работы и модификации (vector, quaternion, scalar) гораздо удобнее (и, возможно, быстрее) утрамбованной матрицы 4х4.
Попробуй-ка проинтерполируй такую матрицу, например.

#36
15:58, 6 апр. 2018

Deamon
> Вывод: кватернион можно использовать для того, чтобы хранить поворот в игровых
> файлах в целях уменьшения размера. Но он никак не подходит для хранения
> промежуточных и конечных значений в коде движка. Финиш!
А как мне тогда интерполировать между ключевыми кадрами анимации?

Eugene
> quaternion, scalar
Равномерное масштабирование же как раз же можно сразу в кватернион вмножить. Как следствие, мы можем даже объединять такие преобразования вместе и на выходе так же получить (traslation, rotation*scale), не используя матрицы в принципе.

V -> Ta + Ra*Sa*V -> (Tb + Rb*Sb*Ta) + (Rb*Ra)*(Sb*Sa)*V

Это наоборот, когда растяжение анизотропно, приходится отдельно хранить коэффициенты для каждой из трёх осей, и композиция вылезает в общую 3*4 матрицу.
#37
16:05, 6 апр. 2018

Eugene
Про тройку вполне согласен.

Я уже долгое время занимаюсь написанием движка, который воспроизводит картинку из World of Warcraft из игровых файлов.

Так вот, дорожки анимации в файлах там так и заданы: для каждого гражданина из тройки (vector, quaternion, scalar) для каждой кости своя отдельная дорожка с парами [time, value].
И для анимации сначала интерполируется каждый гражданин в отдельности, а потом собирается в mat4x4

Почему я взъелся на скелетную анимацию? Потому что предыдущие товарищи на этом форуме как раз пытались вывернуть кватернионы для скелетной анимации. И я более чем уверен, что товарищ топикстартер со временем попытался бы сделать то же самое 

#38
16:58, 6 апр. 2018

}:+()___ [Smile]
> Если же творится какая-то хрень, то, скорее всего, ты налажал с математикой. У
> тебя кватернионы из библиотеки или самописные?
Самописные. Вроде перепроверял много раз. Перепроверю еще раз.

#39
18:23, 6 апр. 2018

Bald
Зря. Писать математику лучше тогда, когда ты хотя бы понимаешь, как она работает никогда.

#40
20:02, 6 апр. 2018

Bald
> Перепроверю еще раз.
Формулы проверять бесполезно, надо писать тесты.
Делаешь матрицу и кватернион поворота на угол α вокруг оси X/Y/Z, потом переводишь кватернион в матрицу и сравниваешь.
Берешь пару радномных кватернионов и проверяешь, что toMatrix(q1 * q2) = toMatrix(q1) * toMatrix(q2).
И т. п.

#41
20:31, 6 апр. 2018

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

}:+()___ [Smile]
> Формулы проверять бесполезно, надо писать тесты.
> Делаешь матрицу и кватернион поворота на угол α вокруг оси X/Y/Z, потом
> переводишь кватернион в матрицу и сравниваешь.
> Берешь пару радномных кватернионов и проверяешь, что toMatrix(q1 * q2) =
> toMatrix(q1) * toMatrix(q2).
Ок

#42
10:38, 7 апр. 2018

Все, получилось. Точно, проблема как всегда была в кривых ручках глазах. Ошибка в функции умножения кватернионов.

Еще раз всем спасибо, и прошу прощения, кому нагрубил.
И отдельно Eugene за наставление на путь истинный.

#43
13:24, 11 апр. 2018

Eugene
> Попробуй-ка проинтерполируй такую матрицу, например.
Линейно? С кватернионами можно выполнять сферическую интерполяцию, и в этом конешно плюс.

#44
13:48, 11 апр. 2018

g-cont
> Линейно?
Тю. Линейно базис интерполировать вредно для кармы.

Хотя для скелетки это даже полезно.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

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