Добавить возможность скалинга

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

VladPro
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 15.10.2005 (Сб) 23:52

Добавить возможность скалинга

Сообщение VladPro » 27.06.2007 (Ср) 19:41

Объясните мне одну вещь, плиз.

Делаю трансформацию меша:
D3DXMatrixRotationX matRotation, angleX
D3DXMatrixMultiply matRotation, matRotation, matTemp
D3DXMatrixIdentity matTemp

D3DXMatrixRotationY matRotation, angleY
D3DXMatrixMultiply matRotation, matRotation, matTemp
D3DXMatrixIdentity matTemp

D3DXMatrixRotationZ matRotation, angleZ
D3DXMatrixMultiply matRotation, matRotation, matTemp

D3DXMatrixTranslation MatTranslation myX, myY, myZ

D3DXMatrixMultiply matWorld, matRotation, MatTranslation

D3DDevice.SetTransform D3DTS_WORLD, matWorld

Мне нужно добавить в эту функцию возможность скалинга. Вопрос - как это сделать? В каком порядке производить трансформации? Сейчас - поворот, затем перемещение. Как добавить скалинг?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.06.2007 (Ср) 22:28

c помощью D3DXMatrixScaling получить ещё одну матрицу. Все три матрицы перемножить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VladPro
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 15.10.2005 (Сб) 23:52

Сообщение VladPro » 27.06.2007 (Ср) 22:55

Это понятно. В какой последовательности перемножать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.06.2007 (Ср) 23:01

По моим сведениями - не важно. Дело в том что я уже много лет этими делами не занимался, а по сему забыл, в какой операции с матрицами порядок имеет значние. Но здесь, если мне не изменяет память, порядок не важен.


Т.е. код будет таким как сейчас, за исключением того, что будет создана ещё одна матрица и "примножена" и имеющемуся произвдеению.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VladPro
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 15.10.2005 (Сб) 23:52

Сообщение VladPro » 28.06.2007 (Чт) 22:35

Ну вот например

D3DXMatrixMultiply matWorld, matRotation, MatTranslation

В matWorld будет правильный результат. А если

D3DXMatrixMultiply matWorld, MatTranslation, matRotation

- неправильный.

Объясните, люди добрые! :)

Что на что множить, и в каком порядке? Когда матриц две, и вариантов всего два. Когда три - малость поболе :) К тому же, хочется понять принцип наконец.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 28.06.2007 (Чт) 22:51

VladPro
Как раз последовательность важна. Сначала нужно поворот. Объясню как понимаю я:
Пустая матрица поворачивается вокруг начала координат(0,0,0), потом к координатам прибавляется положение в пространстве, потом происходит перемножение(скалинг). Если перепутать и умножить Trans на Rot будет проиходить поворот вокруг точки Trans. Частенько путался в начале.
Вот код который я всегда юзаю. Дескать кирпичик
Код: Выделить всё

Public Function MatTranslate(Vec As rREx_Vector3D) As D3DMATRIX
Dim mtrx As D3DMATRIX
D3DXMatrixIdentity mtrx
D3DXMatrixTranslation mtrx, Vec.x, Vec.Y, Vec.z
MatTranslate = mtrx
End Function

Public Function MatRotate(Vec As rREx_Vector3D) As D3DMATRIX
Dim mtrx As D3DMATRIX, mtrx2 As D3DMATRIX, mtrx3 As D3DMATRIX, TmP As D3DMATRIX
D3DXMatrixIdentity mtrx
D3DXMatrixRotationX mtrx, Vec.x
D3DXMatrixIdentity mtrx2
D3DXMatrixRotationY mtrx2, Vec.Y
D3DXMatrixIdentity mtrx3
D3DXMatrixRotationZ mtrx3, Vec.z
D3DXMatrixMultiply TmP, mtrx, mtrx2
D3DXMatrixMultiply MatRotate, TmP, mtrx3
End Function

Public Function MatScale(Vec As rREx_Vector3D) As D3DMATRIX
Dim mtrx As D3DMATRIX
D3DXMatrixIdentity mtrx
D3DXMatrixScaling mtrx, Vec.x, Vec.Y, Vec.z
MatScale = mtrx
End Function

Public Sub TransformWorld(Pos As rREx_Vector3D, Rot As rREx_Vector3D, SC As rREx_Vector3D)
Dim mPos As D3DMATRIX, mRot As D3DMATRIX, msc As D3DMATRIX, TmP As D3DMATRIX
D3DXMatrixIdentity mPos
D3DXMatrixIdentity mRot
D3DXMatrixIdentity msc
D3DXMatrixIdentity matWorld
mPos = MatTranslate(Pos)
mRot = MatRotate(Rot)
msc = MatScale(SC)
D3DXMatrixIdentity TmP
D3DXMatrixMultiply TmP, mRot, mPos
D3DXMatrixMultiply matWorld, TmP, msc
d3dDevice.SetTransform D3DTS_WORLD, matWorld
End Sub

Вектора можно заменить на обычные :D
#define ROFL 0xDDDD

VladPro
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 15.10.2005 (Сб) 23:52

Сообщение VladPro » 03.07.2007 (Вт) 21:53

Я тут немного погонял скалинг. Короче, по идее надо множить матрицу скалинга на матрицу перемещения, а не наоборот. У меня по крайней мере так выходит :)


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 40

    TopList