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

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

Страницы: 1 2 3 4 Следующая »
#15
19:02, 5 апр. 2018

Bald
> Спасибо. Буду дальше долбить в эту сторону, хотя сам от этого ушел.
Важно разобраться со стороной умножения.
Когда комбинируешь преобразования, они "применяются" в сторону от вектора.

Черт, сложная фраза...

Так или иначе, весь твой расчет на самом глобальном уровне выглядит как result = transformN * ... * transform2 * transform1 * vector. Или наоборот, result = vector * transform1 * transform2 * ... * transformN. Трансформации применяются в порядке номеров.

> При аккумулировании трансформаций в кватернионе в нем также будет накапливаться
> ошибка, которая приведет к неортогональности базиса модели, либо она будет
> существенно мала  даже при долгом аккумулировании?
Нормированный кватернион не может быть "неортогональным" по определению ортогональности.
Однако, может со временем "плыть" ориентация этого базиса.


#16
19:03, 5 апр. 2018

Bald
> Я спрашивал сколько мне надо параметров, чтобы повернуть луч? <...>
Так всё-таки, сколько? Если не трогать макушку, сколько как минимум нужно чисел, чтобы указать точно, в какую сторону поставить нос?

#17
19:05, 5 апр. 2018

Bald
> Вращение корабля по всем осям: тангаж и на выбор пользователя либо рысканье, либо крен
Это годится лишь для самолета, где есть фиксированное направление ВВЕРХ
Для космоса - матрица 3х3
Кватернионами не пользуюсь

#18
19:14, 5 апр. 2018

Aslan
Опа. Ты зачем тут все эйфорию портишь?)))

Delfigamer
> Bald
> > Я спрашивал сколько мне надо параметров, чтобы повернуть луч? <...>
> Так всё-таки, сколько? Если не трогать макушку, сколько как минимум нужно
> чисел, чтобы указать точно, в какую сторону поставить нос?
Мне нужно 4 числа. А сколько надо иметь самовлюбленности и гордыни, чтобы лезть со своими носом выпендрежами в вопрос на конкретную тему.

Eugene
Еще раз спасибо!

#19
19:18, 5 апр. 2018

Bald
> Мне нужно 4 числа.
Зачем столько? Нельзя обойтись только двумя?

#20
21:29, 5 апр. 2018

Bald
> Очень многие (опять же на этом форуме) утверждают, что для однозначного определения положения тела в пространстве достаточно одного кватерниона. Как-то это не укладывается в моей голове.
Единичный кватернион однозначно (вообще-то, двузначно, но не суть) соответствует ортонормированной 3х3 матрице поворота (с единичным детерминантом).
Т. е. любые расчеты с участием матриц поворота можно заменить на соответствующие расчеты с кватернионами.
При этом, количество участвующих кватернионов и матриц, очевидно, должно совпадать.

> При аккумулировании трансформаций в кватернионе в нем также будет накапливаться ошибка, которая приведет к неортогональности базиса модели, либо она будет существенно мала даже при долгом аккумулировании?
Да, в кватернионах тоже накапливается ошибка, он перестает быть единичным. Причем, помимо очевидного q = normalize(q), есть более быстрый вариант починки: q *= 1.5 − 0.5 * length2(q).
Кстати, аналогичным образом можно чинить накапливающуюся неортонормированность матриц: M *= 1.5 * identity − 0.5 * transpose(M) * M.

#21
22:07, 5 апр. 2018

Bald
> Я вроде упомянул в вопросе, что не понимаю кватернионы. Поэтому пользуюсь
> наощупь.
Представь, что у тебя есть не кватернион, а произвольный вектор, вокруг которого ты можешь вращать объект на любой угол. Вот вектором + углом ты можешь описать любое вращение. Вот кватернион примерно так и хранит внутри себя поворот.

#22
22:51, 5 апр. 2018

Если не подскажут ничего полезного, как это в основном здесь бывает, отталкивайся от этого урока и точно так же вращай ось Up.

#23
6:30, 6 апр. 2018

}:+()___ [Smile]
> q *= 1.5 − 0.5 * length2(q)
Ух ты, Ньютон? Не думал, что увижу тебя здесь!

Bald
Ладно, фиг с ним, смотри.
Пусть у нас есть голова в исходном положении, и некая голова в положении произвольном. Надо описать вращение от исходного к произвольному.
Начнём с того, что, в каком бы положении голова не находилась, мы всегда можем провести луч в направлении носа. Чтобы описать направление этого луча, нам достаточно двух углов - азимут и возвышение. Подобно тому, как широта и долгота однозначно определяют положение на поверхности шара, азимут и возвышение позволяют задать произвольное положение луча. В локальной системе координат, азимут - это первое вращение, вокруг оси Z, возвышение производится после вокруг локальной оси Y. Так мы направляем ось X вдоль заданного луча.
Поскольку направление взгляда нашей промежуточной головы совпадает с целевой, чтобы докрутить голову до победного конца, нам остаётся только довернуть макушку до её положения, на что нам достаточно одного угла - крена, вращающего вокруг локальной оси X.
Таким образом, мы можем любое положение головы описать тремя числами - Эйлеровыми углами. Процедура установки головы в нужное положение в таком случае - это три вращения вокруг фиксированных осей. Если мы крутим по осям, вращающимся вместе с головой, то крутить нужно в порядке азимут-возвышение-крен; если мы крутим вокруг глобальных осей XYZ, то крутим в обратном порядке - сначала крен, затем возвышение, затем азимут.
Чтобы перейти к альтернативному представлению, рассмотрим более простой случай - вращение на плоскости.
Для описания этого вращения достаточно одного угла, пусть будет {a}. То же преобразование мы можем описать матрицей поворота {{Cos[a], -Sin[a]}, {Sin[a], Cos[a]}}. Эта матрица хранит 4 числа, однако, они не меняются независимо друг от друга. Произвольная матрица {{c,d}, {e,f}} будет матрицей поворота только в том случае, если она нормированная и ортогональная. Нормированность означает, что c2 + e2 = 1 и d2 + f2 = 1, ортогональность - что c*d + e*f = 0. Эти уравнения привязывают разные числа друг к другу, так что в конечном итоге остаётся только один свободный параметр, задаваемый произвольно, тогда как остальные выражаются через уравнения. Это и имеют в виду, когда говорят, что вращение в плоскости - это одна степень свободы.
Посмотрев на матрицу внимательно, мы можем обнаружить ещё один способ хранения вращения - пару чисел {x, y} = {Cos[a], Sin[a]}; тогда матрица будет выражена как {{x, -y}, {y, x}}.
Операции над вращениями, такие как композицию и инверсию, мы можем выразить через операции над углом. Чтобы объединить два поворота {a} и {b}, мы делаем один поворот на {a + b}; чтобы обратить поворот на {a}, мы поворачиваем на {-a}. Если повороты выражены в виде комплексных чисел {x, y}, то мы можем проводить такие операции следующим образом - переводить из комплексных чисел в углы, сложить углы и затем перевести обратно. Однако, такого же результата можно добиться, проведя операцию напрямую над компонентами комплексного - чтобы объединить повороты {x1, y1} и {x2, y2}, мы высчитываем {x1 x2 - y1 y2,   x1 y2 + x2 y1} - и получаем такой же результат.
Сколько степеней свободы у комплексного числа? Вспомним, что {x, y} - это косинус и синус одного угла, следовательно, они должны подчиняться соотношению x2 + y2 = 1. Значит, у комплексного числа так же остаётся только одна степень свободы.
Переход от одного угла к комплексному числу - это частный случай перехода от эйлеровых углов к кватерниону, и в общие идеи в них совпадают. Мы можем хранить поворот в виде углов {a, b, c}, а можем посчитать соответствующую им четвёрку {x, y, z, w}. В силу того, как получается эта четвёрка, x2 + y2 + z2 + w2 = 0. Композицию двух двумерных поворотов можно высчитывать через углы - что, в отличие от плоского случая, пожалуй, самый сложный способ - а можем применить специальную операцию над двумя кватернионами. Так же, подобно комплексным числам, из компонент кватерниона легко составить матрицу поворота.
Ну и да, произвольный поворот в трёхмерном пространстве - это три степени свободы.

#24
9:35, 6 апр. 2018

Bald
каждый раз вращай исходный объект, а не объект, полученный на прошлом кадре.

#25
11:21, 6 апр. 2018

*Lain*
Это я уже и сам понял)

Delfigamer
Спасибо, конечно, за интересный ответ. Но теорий я уже обчитался, мне от этого не легче... (наверно не для моих мозгов))))

Daniil Petrov
Спасибо, почитаем.
For example, this camera doesn't allow for pitch values higher than 90 degrees and a static up vector of (0,1,0) doesn't work when we take roll values into account.
Но это же способ для "ходилок", но никак не для космического корабля.(((

MrShoor
Определение кватерниона я прекрасно понимаю, и понимаю что он делает. Я не понимаю как им пользоваться.

По наставлениям Eugene я взял один кватернион. "Накидываю" (и справа и слева пробовал) на него происходящие трансформации на каждом кадре. В конечном итоге, я перевожу этот кватернион в матрицу вращения и ею вращаю объект. Объект ведет себе непредсказуемо. Он управляется нормально при небольших отклонениях от первоначальной вектора "вперед". Но на углах ближе к 90 (а про разворот я уж вообще молчу) оси начинают  перемешиваться. Пробую накапливать повороты и от локальной системы координат и от глобальной - видно что оси поворачиваются по различным законам, но нужного результат нет.

#26
11:34, 6 апр. 2018

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

#27
11:36, 6 апр. 2018

Eugene
Я перевожу кватернион в конце в матрицу поворота. Я не умножаю чисто вектор на кватернион....

#28
11:59, 6 апр. 2018

}:+()___ [Smile]
> Причем, помимо очевидного q = normalize(q), есть более быстрый вариант починки:
> q *= 1.5 − 0.5 * length2(q).
> Кстати, аналогичным образом можно чинить накапливающуюся неортонормированность
> матриц: M *= 1.5 * identity − 0.5 * transpose(M) * M.
А вот за это отдельное спасибо. Может и не в этот раз, но обязательно пригодится!

#29
12:00, 6 апр. 2018

Bald
Это не имеет значения. Трансформация в любом представлении остается трансформацией и в итоге всегда умножается на вектор.
И если математика написана не через жопу... Порядок умножения в ней либо строго один, либо поддерживаются оба и они согласованы.
Окей, с этим ты уж как-нибудь разберешься, а я буду писать формулы (если буду) в классической математической нотации.

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

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

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