![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интерполяция матриц
Зм1й © (2006-01-25 19:49:00)Подскажите пожалуйста, как можно интерполировать две матрицы 4*4, содержащие в себе параллельный перенос, поворот и масштабирование? А то я чё-то совсем запарился...
Sapersky (2006-01-26 19:05:00) [1]В GLScene (VectorGeometry.pas) есть MatrixDecompose. Не знаю правда, насколько хорошо работает.
Cash (2006-01-26 18:50:00) [2]Посмотри здесь:
http://www.gamedev.ru/coding/10805.shtml
вдуг поможет.
MBo (2006-01-26 18:37:00) [3]M - матрица 4x4
думаю, понятно, что из нее легко выделить матрицу переноса T, остается левая верхняя матрица X 3x3. Поскольку из нее требуется выделить диагональную(масштаб) и ортонормальную(вращения), то в голову приходит SVD-разложение X=L*S*R, где L и R - ортонормальные, а S - диагональная с неотрицательным элементами. Более простые методы факторизации - LU или QR, к сожалению, не дают подходящего для данной цели разложения.
Ортонормальные матрицы интерполируются с помощью SLERP, а остальные -простой линейной интерполяцией.
Кстати, если без масштабирования - то это будет похоже на Key Frame Animation, что у игроделов популярно.
Зм1й (2006-01-26 18:15:00) [4]
> Придется разложить
Это ужасно. Ну если уж это единственный способ, не подскажете, как это можно сделать?
MBo (2006-01-26 17:46:00) [5]Придется разложить обобщенные матрицы аффинного преобразования на матрицы простых преобразований (поворота и т.д.), и уже для них выполнять интерполяцию, перемножая для получения промежуточных обобщенных матриц.
Зм1й (2006-01-26 17:35:00) [6]
> Ну, елки палки, доели видать тебя эти две матрицы. :)
Ни говори-ка, я наверно скоро повешусь
Cash (2006-01-26 17:10:00) [7]Зм1й © (26.01.06 16:34) [5]:
Ну, елки палки, доели видать тебя эти две матрицы. :)
Не, я так и не понял, с какой собаки ты интерполяцию сюда приписываешь?
Мож я про ету кракозяблю не все помню..., а мож и ты чего лишниго ей
пририсовать хочешь! Надобы этот вопрос разъяснить сперва.
Зм1й (2006-01-26 16:34:00) [8]В том-то и смысл, что нужно интерполировать две результирующиематрицы (перенос, поворот и масштаб - это однаматрица), ни прибегая к интерполяции отдельных векторов... Понимаете???
A22 (2006-01-26 15:30:00) [9]проще всего интерполировать вектор-данные, по которым можно результирующую матрицу построить. т.е. есть два набора векторов: позиция, углы, масштаб по осям. можно интерполировать с нужным коэффициентом эти векторы и построить по ним матрицу. думаю, это будет лучшим вариантом, так как есть матрицы масштабирования и переноса еще можно "интерполировать", получая корректный промежуточныйй вариант для
0 < t < 1, то с матрицей поворота все не так просто - ее придется пересчитывать. возможно, есть способ быстрого ее пересчета, но, к сожалению, без справочника под рукой указать КАК не могу :(
Cash (2006-01-26 13:56:00) [10]Три раза перечитал вопрос..., ничего не понял!
Батенька!... Так иьзя! :)))
Ну есть у нас три матрицы:
- поворот
- масштаб
- перенос
Q: Ну... что мы можем с ними еще сделать?
(уж точно не интерполировать!)
A: Мы можем получить результирующую матрицу!
TM - матрица переноса
RM - матрица поворота
SM - матрица масштабирования
ResM - результат
ResM := SM*RM*TM, иначе никак!
Это можно произвести с помощью
D3DXMatrixMultiply(ResultM,LeftM,RightM);
Q: А чё мы можем сделать с этой резултирующей матрицей?
A: Получить результирующие вектора для вершин!
Это делается с помощью:
D3DXVec3TransformCoord(ResultV,SourceV,ResultM);
Зм1й (2006-01-26 12:24:00) [11]Ну как же, есть ведь интерполяция векторов(вершин), кватернионов, а мне нужно с матрицами
MRot1:=Mul(Mul(MRotX1, MRotY1), MRotZ1);
M1:=Mul(Mul(MTrans1, MRot1), MScl1);
MRot2:=Mul(Mul(MRotX2, MRotY2), MRotZ2);
M2:=Mul(Mul(MTrans2, MRot2), MScl2);
M_Intermediate:=Interp(M1, M2, T); // 0<=T<=1
Подскажите пожалуйста, очень надо!
Кефир87 (2006-01-25 22:13:00) [12]Какая интерполяция? В этой матрице хранятся конкретные данные. Чего там интерполировать?