|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Помогите с матрицей
Напишите пожалуйста примеры работы с матрицей, а то я вообще даже не знаю с чего начать, а это очень нужно более-менее узнать до завтра.
Вот что известно: Код:
Ясно, что если нам потребуется (а нам потребуется :) ) проводить для каждой точки в пространстве параллельный перенос + поворот в пространстве, то придется сделать огромное количество преобразований. Можно построить матрицы преобразований, помножив точку - вектор на которую, мы получим результат — координаты искомой точки. матрица параллельного переноса: [ 1 0 0 0 ] [ 0 1 0 0 ] [ 0 0 1 0 ] [ x y z 1 ] матрица растяжения/сжатия: [ z 0 0 0 ] [ 0 y 0 0 ] [ 0 0 x 0 ] [ 0 0 0 1 ] матрица поворота вокруг оси x: [ 1 0 0 0 ] [ 0 cos α sin α 0 ] [ 0 -sin α cos α 0 ] [ 0 0 0 1 ] матрица поворота вокруг оси y: [ cos α 0 -sin α 0 ] [ 0 1 0 0 ] [ sin α 0 cos α 0 ] [ 0 0 0 1 ] матрица поворота вокруг оси z: [ cos α sin α 0 0 ] [-sin α cos α 0 0 ] [ 0 0 1 0 ] [ 0 0 0 1 ] Теперь, зачем нужны матрицы в 3D-програмировании, если можно все сделать с помощью векторов, и если, например, поворот точки с помощью векторов занимает меньше операций, чем используя матрицы. Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей |
#2
|
|||
|
|||
Правило перемножения матриц:
C[ni, nj] = A[ni, nk] * B[nk, nj] (это размерности) С[i, j] = sum(A[i, k] * B[k, j]) (это элементы, где k= 1..nk). В нашем случае имеем x1[1x4] = x0[1x4] * A[4x4], где x0 - координаты до преобразования (x, y, z, 1), x1 - координаты после преобразования. Код:
var x1, x0: array[1..4] of Real; A: array[1..4, 1..4] of Real; procedure TForm1.FormCreate(Sender: TObject); var i, j: Integer; begin for i:= 1 to 4 do begin x1[i]:= 0; for j:= 1 to 4 do x1[i]:= x1[i] + x0[j] * A[i, j]; end; end; Последний раз редактировалось AlexSku, 04.02.2008 в 12:37. |
#3
|
||||
|
||||
Спасибо
Я конечно хотел бы наглядный пример, почитав твое сообщение и 10 раз пересмотрев пример переумножения я наконец понял как её умножать, спасибо.
Да вот ещё вопрос почему матрица 4х размерная, а не 3х(x,y,z) Что значит последнее значение в 4х размерной матрице? ведь координаты 3(x,y,z) ? Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей Последний раз редактировалось Oleg, 04.02.2008 в 14:08. |
#4
|
||||
|
||||
Цитата:
Либо я чего то не допонял, либо Вы автор не понял глубины смысла описания матрицы. Матрица это такой же массив данных как и вектор. Только у вектора есть лишь строка, а у матрицы строка и столбец. Так же матрица может быть трёх мерной, в таком случае у неё каждая ячейка будет иметь несколько слоёв, для наглядности представьте кубик-рубик. Примерно так... Описание матрицы: Код:
Имя_Переменной :array[Количество столбцов, Количество строк] of Тип данных; ICQ: 278869299 "Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт |
#5
|
|||
|
|||
В DirectX наряду с матрицами 4х4 используют также кватернионы (4 числа) для описания вращений. Что касается матриц, то, скорее всего, это координата веса (w, Weight), которую обрабатывает видеопроцессор. Ему можно передавать несколько матриц, надо чтобы все w в сумме давали 1, таким образом реализуется смешивание (weight blending). Подобное реализуется и в альфа-канале цвета, но у него свои алгоритмы. Можно попробовать сделать элемент [4, 4] меньше 1, тогда должно неправильно работать освещение.
|
#6
|
|||
|
|||
Прочитал в книжке, что число матрицы _44 это коэффициент, на который делятся координаты x, y, z. Поставил 0.5 (в matWorld) и картинка увеличилась.
|
#7
|
||||
|
||||
AlexSku, спасибо что пояснил
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей |