Экспорт skinned mesh из макса: хелп!
От: Manstopper  
Дата: 13.05.03 19:40
Оценка:
Помогите, я уже задолбался, у меня скоро крыша поедет!

Пытаюсь делать сабж, все бы здорово, но чего-то я, видимо, туплю.

Нужно мне следующее: записанный в файл меш и анимация костей, причем
матрицы должны быть уже просчитаны (иерархия мне не нужна). Короче
говоря, грузим в движке из файла vertex buffer (вертексы с весами, я
юзаю indexed vertex blending), index buffer, и пресловутые матрицы
костей, делаем для соответствующей позы что-то типа
for(UINT nBone=0; nBone < m_nNumBones; nBone++)
lpDevice->SetTransform(D3DTS_WORLDMATRIX(nBone),
&m_nBones[nPose][nBone]);
и вуаля, на экране должен появится меш в соответствующей позе.

Я уже чего только не перепробовал, и все не работает! Как
таки-правильно преобразовать матрицы и вершины, чтобы получилось то, о
чем я написал выше? Если можно поподробнее, заранее благодарен

С меня пиво, если что

ЗЫ: Уточняю, использую не physique modifier, а ISkin
Re: Экспорт skinned mesh из макса: хелп!
От: Tora-Bora  
Дата: 14.05.03 05:34
Оценка:
Здравствуйте, Manstopper, Вы писали:

M>Помогите, я уже задолбался, у меня скоро крыша поедет!


M>Пытаюсь делать сабж, все бы здорово, но чего-то я, видимо, туплю.


M>Нужно мне следующее: записанный в файл меш и анимация костей, причем

M>матрицы должны быть уже просчитаны (иерархия мне не нужна). Короче
M>говоря, грузим в движке из файла vertex buffer (вертексы с весами, я
M>юзаю indexed vertex blending), index buffer, и пресловутые матрицы
M>костей, делаем для соответствующей позы что-то типа
M>for(UINT nBone=0; nBone < m_nNumBones; nBone++)
M>lpDevice->SetTransform(D3DTS_WORLDMATRIX(nBone),
M>&m_nBones[nPose][nBone]);
M>и вуаля, на экране должен появится меш в соответствующей позе.

M>Я уже чего только не перепробовал, и все не работает! Как

M>таки-правильно преобразовать матрицы и вершины, чтобы получилось то, о
M>чем я написал выше? Если можно поподробнее, заранее благодарен

M>С меня пиво, если что


M>ЗЫ: Уточняю, использую не physique modifier, а ISkin


Когда пишешь lpDevice->SetTransform(D3DTS_WORLDMATRIX(nBone),&m_nBones[nPose][nBone]);ты только устанавливаешь трансформацию над объектом который будет рисоваться далее, над мешом, а кость это не меш. Все вершины твоего объекта должны содержать информацию о костях к которым они принадлежат и весах. Каждую вершину ты должен трансформировать... вобщем умножить на матрицу кости и на вес этой кости для этой вершины. Посмотри Skinned Mesh в DirectXSDK
Re[2]: Экспорт skinned mesh из макса: хелп!
От: Manstopper  
Дата: 14.05.03 09:42
Оценка:
TB>Когда пишешь lpDevice->SetTransform(D3DTS_WORLDMATRIX(nBone),&m_nBones[nPose][nBone]);ты только устанавливаешь трансформацию над объектом который будет рисоваться далее, над мешом, а кость это не меш. Все вершины твоего объекта должны содержать информацию о костях к которым они принадлежат и весах. Каждую вершину ты должен трансформировать... вобщем умножить на матрицу кости и на вес этой кости для этой вершины. Посмотри Skinned Mesh в DirectXSDK

Стоп-стоп-стоп! Я же юзаю indexed vertex blending, информация о костях и весах есть в FVF:
typedef struct
{
float x, y, z;
float weights[3]; // Веса (первый, второй, третьий, 1.0f-остальные)
BYTE indices[4]; // Индексы матриц
float nx, ny, nz;
float tu, tv;
}SKIN_VERTEX;

#define D3DFVF_SKINVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL | D3DFVF_TEX1)

SetTransform(D3DTS_WORLDMATRIX(nBone)...) как раз позволяет установить матрицу в палитре из 256 матриц,
на которые и ссылаются indices в каждой вершине. Короче, на каждую вершину может быть 4 кости из
256.

Потом остается сделать только так
SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE);

А пример skinned mesh в dx sdk — один из самых мерзких и нечитабельных примеров, имхо.
Re[3]: Экспорт skinned mesh из макса: хелп!
От: Tora-Bora  
Дата: 14.05.03 10:04
Оценка:
Здравствуйте, Manstopper, Вы писали:

А извини, не прочитал верхнюю часть сообщения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.