Кость ведет себя по-разному в 3D Studio Max по сравнению с DirectX или что-то еще? - PullRequest
0 голосов
/ 06 февраля 2010

У меня есть сфальсифицированная (двуногая) и анимированная модель в 3D Studio Max, которую я экспортировал в виде файла .x.

Когда я использую его, анимация запускается нормально, однако я пытался заставить саму модель наклониться и повернуться от бедра, но у меня возникают трудности с поиском того, где в иерархии костей мне следует применять матрицы вращения.

В 3D Studio Max есть объект bipe на модели Bip01, когда я выбираю и вращаю его, каскады вращения на всех костях выше бедра, поэтому я предположил, что применение матриц вращения к одному и тому же D3DXFRAME (с тем же именем , Bip01) будет иметь тот же эффект, но это не так. Происходит то, что эффект в конечном итоге применяется ко всему в иерархии костей, поэтому применение преобразований к Bip01 похоже на применение его к кости маршрута (что может быть, поскольку я не уверен, как отличить одну кость от другой).

Вот код, где обновляются преобразования кадров, и я добавил немного кода, пытающегося применить преобразование матрицы к Bip01, я не уверен, есть ли какой-либо другой соответствующий код, который я могу показать ... (ротация значение - это просто случайное значение, которое я добавил)

void CAnimInstance::UpdateFrames( MultiAnimFrame* pFrame, D3DXMATRIX* pmxBase )
{
    assert( pFrame != NULL );
    assert( pmxBase != NULL );

if (strcmp (pFrame-> Name, "Bip01") == 0) { D3DXMATRIX rot; D3DXMatrixRotationY (& rot, 3.141); D3DXMatrixMultiply (& pFrame-> TransformationMatrix, & PFrame-> TransformationMatrix, и гниль); } * +1010 *

    D3DXMatrixMultiply( &pFrame->TransformationMatrix,
                        &pFrame->TransformationMatrix,
                        pmxBase );


    // transform siblings by the same matrix
    if( pFrame->pFrameSibling )
        UpdateFrames( ( MultiAnimFrame* )pFrame->pFrameSibling, pmxBase );

    // transform children by the transformed matrix - hierarchical transformation
    if( pFrame->pFrameFirstChild )
 {
  UpdateFrames( ( MultiAnimFrame* )pFrame->pFrameFirstChild,
    &pFrame->TransformationMatrix );
 }
}

* То, что я должен сделать, - это найти все дочерние кадры для Bip01 и применить к ним преобразование, но как мне это сделать?

1 Ответ

1 голос
/ 07 февраля 2010

Bip01 является корневым узлом скелета в Character Studio, который, как я полагаю, находится там, где установлен ваш скелет.
Таким образом, ваш код верен, то есть применяя ротацию к bip01, а затем каскадируя ее, чтобы все ее потомки обновили все кости в скелете.

Я предполагаю (и это общее предположение), что причина, почему вы не видите этого в 3D Studio Max, заключается в том, что он настроен с кучей ограничений, чтобы помочь аниматору.

Я бы предложил поиск названий костей - они обычно следуют соглашению bip01 - L Finger 1 и т. Д., Затем находят название бедренной кости (вероятно, это Bip01 - Hip). В качестве альтернативы при запуске в вашем коде, перейдите от Bip01 вниз ко всем дочерним элементам и создайте словарь всех имен костей.

Я уверен, что есть лучший ответ, но так как мой 3DS max довольно ржавый, это самое лучшее, что я могу сделать на данный момент:)

...