ЧЗВ за матрици и кватерниони (4 страници)

Какво е ротационна матрица?

Матрицата на въртене се използва за въртене на точки около координатната система. Докато отделните точки се прикрепват към нови координати, разстоянията между тях не се променят.

Всички завъртания се дефинират от гледна точка на тригонометричните функции синус и косинус.

За 2D координатна система ротационната матрица е:

Ако ъгъл A е 0, тогава получаваме матрицата на идентичност на изхода:

Ако ъгъл А е +90 градуса, тогава матрицата е:

Ако ъгъл А е -90 градуса, тогава матрицата е:

Ъглите на завъртане, взети с обратен знак, са равни на транспозицията на матрицата.

Ако матрицата на въртене се умножи по транспонираното , резултатът е матрицата на идентичност

Как ротационните матрици влияят на координатната система?

Ротационните матрици влияят на координатната система по следните начини:

По конвенция положителните ъгли създават въртене по часовниковата стрелка, когато се гледа от центъра на координатите в положителната посока на оста на въртене.

Следвайки това правило, в дясна декартова координатна система, ще видим следните три изгледа:

Тъй като положителното завъртане създава завъртане по часовниковата стрелка, можете да създадете набор от координати за всяко такова завъртане. За да опростите, помислете за ротация +90:

Може да се опрости така:

В матрицата ще бъде така:

Това са трите основни матрици, които се използват в OpenGL.

Как да генерирам ротационна матрица за оста x?

За 4x4 матрица:

Как да генерирам матрица на въртене по оста Y?

За 4x4 матрица:

Как да генерирам ротационна матрица за оста Z?

За 4x4 матрица:

Какво представляват ъглите на Ойлер?

Ъгли на Ойлер е името, дадено нанабор от ъгли на въртене, определени от около три оси

Те могат да бъдат дефинирани във векторна форма и съхранени във VECTOR структура.

Например, набор от винаги дава матрица на идентичност.

Ако представите ъглите в тази форма, тогава: завъртете +90 градуса X. Завъртете +90 градуса Y. Завъртете +90 градуса Z.

Какво е yaw, roll и pitch?

Yaw, roll и tatch са аеронавигационни термини за въртене в евклидовата координатна система (ъгли на Ойлер), спрямо местната координатна система на самолета.

Представете си, че сте в самолет и гледайте напред.

Оста Z свързва опашката и носа на самолета. X от края на лявото крило до края на дясното крило. Y точки от земята към небето.

Наклон - X завой, Yaw - Y завой, Накланяне - Z завой.

Как да комбинирам ротационни матрици?

Матриците на ротация се комбинират с помощта на умножение на матрици. Така че редът на умножение е много важен.

Какво е заключване на оста?

Фиксирането е проблем при използване на ъгли на Ойлер. Тъй като крайното въртене зависи от реда на умножение, може да се случи, че една ос на въртене е картографирана върху друга ос.

Поради това ще стане невъзможно да завъртите обекта в желаната ос.

Например, ако завъртите обекта в ред Z,Y,X и завъртите по оста Y на 90 градуса.

В този случай въртенето по оста Z ще бъде направено първо, , което означава, че ще бъде направено, нали. Оста Y също е правилна. Въпреки това, след завъртане по Y, оста X ще се завърти по Z-ос.

Така че всяко завъртане в X всъщност ще се върти в Z.

Единственото решение на този проблем е използването на кватерниони.

Как правилно да комбинирате ротационни матрици?

Всъщност,няма "правилен път". Въпреки това, за да можете да предвидите резултата, е необходима известна организация. Това също е необходимо когато създавате пълноценна библиотека с 3D матрици.

Най-лесният начин да завъртите обект е:

където M е крайната матрица на въртене, а X,Y,Z са матриците на въртене по осите. Те ще опишат въртене по X (наклон), след това по Y (отклоняване) и накрая по Z (накланяне).

От гледна точка на наблюдателя обаче редът на ротациите ще бъде обърнат.

Например, ако стоите и се обръщате наляво, тогава всичко във вашето зрително поле се движи надясно.

Обаче всеки, който те погледне, ще каже, че си се обърнал надясно.

Така че изгледът от камерата трябва да бъде моделиран в този ред:

Тази обратна ротационна матрица се генерира ако камерата се счита за друг обект.

Как да генерирам ротационна матрица от ъгли на Ойлер?

На пръв поглед най-очевидният начин за създаване на ротационна матрица от ъгли на Ойлер е да се създаде всяка матрица отделно и да се умножат една по друга.

Този метод обаче е много скъп по отношение на времето за обработка. За матрица 4x4 10 елемента гарантирано са 0, два са 1, а останалите четири ще имат някаква стойност, повече от 75% от всички матрични операции ще бъдат пропилени. И това не се брои конфигурирането и инициализирането на всяка матрица.

Заедно повече от 75% от всички операции ще бъдат изразходвани за нула или един резултат.

Необходимо е по-ефективно решение. За щастие има друг начин, дефиниране на крайната матрица.

Ако и трите матрици са записани в алгебрична форма, тогава получаваме следния израз:

Където M е крайната матрица, X е ротационната матрица X, Y е ротационната матрица Y, Z е ротационната матрица Z,

След като рисуваме, получаваме:

КъдетоA,B косинус и синус на въртене в X, C,D косинус и синус на въртене в Y, E,F косинус и синус на въртене в Z,

Готовият алгоритъм ще изглежда така:

Оптимизираният алгоритъм изисква само 12 умножения, 6 изваждания и 18 присвоявания.

Както можете да видите, когато използваме оптимизирания алгоритъм, получихме увеличение на производителността от 1000%.

Как да конвертирам ротационна матрица в ъгли на Ойлер?

Тази операция е обратна на предишния въпрос. Дадена е ротационна матрица:

където A,B е косинусът и синусът на ъгъла по оста X, C,D е косинусът и синусът на ъгъла по оста Y, E,F е косинусът и синусът на ъгъла по оста Z,

Когато използвате структурата на Cish за матрица 4x4, индексите на елемента ще бъдат както следва:

Сравнявайки тези таблици, можете да видите, че елементът [2] съответства на стойността -D или -sin(Y). Това означава, че въртенето в Y може да се изчисли чрез арксинуса. Прехвърляйки получената стойност към косинуса, получаваме стойността C.

Ако C не е равно на 0, тогава въртенето в X и Z може да се получи съответно от третата колона и първия ред:

Ъглите могат да бъдат получени чрез разделяне на всяка двойка стойности на C и получаване на отговора по отношение на арктангенса.

Ако C е 0, тогава тези изчисления са невъзможни. В този случай ротацията в Y ще бъде или -90, или 90. Така че D ще бъде или 1, или -1.

В този случай получаваме фиксирането на оста. Завъртането по осите X и Z ще се извършва на една и съща ос. Това се вижда от изчисляването на осите на въртене.

Тези две стойности са отговорни за синуса и косинуса на една ос на въртене.

Алгоритъмът ще бъде като този:

Как да генерирам ротационна матрица за избрани оси и ъгли?

Има само един начин да се създаде този тип ротационна матрица чрез кватернионна математика.

Вижте въпрос Q54.

Как могагенериране на ротационна матрица, проектираща един вектор върху друг?

Когато създавате анимационни програми, често е необходимо да намерите матрица на въртене, за да проектирате посоката на един вектор върху друг.

Този проблем може да бъде представен като два вектора, идващи от една и съща точка. Тогава цялото поле на стойностите на въртене ще образува сфера.

На теория има безкраен брой оси на въртене и ъгли, които могат да проектират един вектор върху друг. Всички те лежат в равнината , където всички точки лежат на равни разстояния от двата вектора.

Само едно решение обаче представлява практически интерес. Това е пътят, който ще има най-късото ъглово разстояние между векторите.

Въртенето на оста по този път се изчислява чрез векторното произведение между два вектора:

Тъй като Земята е кръгла, най-краткият път ще има най-късото ъглово въртене между двата града.

Как да използвам матрици за преминаване от една координатна система към друга?

Подобно на предишния проблем, трябва да прехвърлите една координатна система към друга. Все пак, вместо да се опитвате да проектирате една координатна ос към друга,

необходимо е да се комбинират и трите оси. Координатните системи са представени като 3x3 или 4x4 матрици.

Проблемът е да се намери ротационна матрица, която преобразува една матрица в друга. Математически би било така:

Следователно проблемът е да се намери матрицата Mrot. Може да се направи

чрез пермутация в уравнението:

Така желаната матрица може да бъде изчислена чрез умножаване на обратната матрица в оригиналната система по крайната ротационна матрица.

За проверка нека си представим, че както оригиналната, така и крайната матрица са идентични матрици. След това ротационната матрица трябвасъвпадат с финала и се обръщат към него.

Веднъж изчислена, ротационната матрица може да бъде преобразувана в кватернион.

Какво е трансферна матрица?

Матрицата за превод се използва за позициониране на обект в 3D пространство, без да го въртите. Прехвърлянето може да се извърши чрез умножение на матрици само когато се използват матрици 4x4.

Ако трансферът е описан от вектора [X Y Z], тогава матрицата 4x4 ще бъде:

Какво е скалираща матрица?

Мащабната матрица се използва за разширяване или компресиране на размерите на 3D модел.

Ако мащабиращият вектор е [X Y Z], тогава матрицата ще бъде:

Какво е матрица на отместване?

Матрицата за изместване се използва за изместване на 3D модела настрани. Например текстът с курсив изисква всеки знак да бъде изместен надясно.

В три измерения има 6 страни на преместване:

o изместване на X в Y o изместване на X в Z o изместване на Y в X o изместване на Y в Z o изместване на Z в X o изместване на Z в Y

Всичките 6 посоки на срязване могат да бъдат събрани в една матрица:

Където Sij внедрява отместване I върху J И така, Sxy измества X върху Y

Теоретично въртенето в три измерения може да бъде комбинация от изместване в 6 посоки.

Как да интерполирам линейно две матрици?

При дадени две матрици задачата е да се намери начин за определяне на средните точки в зависимост от променливата t, която варира от 0,0 до 1,0.

Това може да стане чрез транслиране на две матрици или в ъгли на Ойлер, или в сферични ъгли (кватерниони) и транслационен вектор. В този случай всяка матрица се превръща в двойка 3D вектори.

Интерполацията между тези два вектора може да се извърши с помощта на стандартната формула за линейна интерполация:

Това уравнение може да се приложи и към векторатранслация и върху вектора на въртене.

Веднъж дефинирани, окончателното преместване и завъртане могат да бъдат преведени обратно в средната матрица.

Как да направя кубична интерполация между четири матрици?

При дадени четири ротационни или транслационни матрици, задачата е да се намери начин да се определят средните точки, определени от параметъра t.

Това може да се направи с помощта на кубична интерполация.

Както при линейната интерполация, четирите матрици се транслират в съответните транслационни и ротационни вектори (отново или ъгли на Ойлер, или сферични ъгли)

Всеки от четирите вектора се преобразува в един вектор G. Използвайки сплайн математика, този вектор се трансформира в интерполирана матрица M

Ако векторът е даден така:

Това може да стане чрез стандартно умножение матрица-вектор.

Можете да интерполирате с помощта на параметричната променлива t:

Резултатът може да бъде преобразуван обратно в ротационна или транслационна матрица.

Трябва да се отбележи, че пътищата на въртене може да се окажат усукани, това е нормално, тъй като алгоритъмът се опитва да намери път с минимално въртене между четири вектора.

От двата метода сферичните ъгли на въртене обикновено дават най-добрата интерполация за въртене.

Как да начертаете матрица?

Когато използвате графичния прозорец за 3D анимация, може да поискате да видите как ротационната матрица влияе върху анимацията.

Обаче простото показване на ротационната матрица като числа не е много ясно.

Като алтернатива можете да начертаете числени данни под формата на графики.

Подобно на графичен еквалайзер в стерео, ротационната матрица може да бъде представена като графика. Всеки елемент от ротационната матрица се изчертава като отделна колона в рамка от -1 до +1.

Матрицата 3x3 ще изглежда така:

За удобство отрицателните стойности могат да бъдат оцветени в различен цвят от положителните.