Sto lavorando alla scrittura del mio importatore COLLADA. Sono arrivato abbastanza lontano, caricando mesh e materiali e così via. Ma ho colpito un ostacolo sull'animazione, in particolare: rotazioni congiunte.COLLADA: la posa a ritroso inverso nello spazio sbagliato?
La formula che sto utilizzando per la scuoiatura le mie maglie è straight-forward:
weighted;
for (i = 0; i < joint_influences; i++)
{
weighted +=
joint[joint_index[i]]->parent->local_matrix *
joint[joint_index[i]]->local_matrix *
skin->inverse_bind_pose[joint_index[i]] *
position *
skin->weight[j];
}
position = weighted;
E per quanto riguarda la letteratura è interessato, questa è la formula corretta. Ora, COLLADA specifica due tipi di rotazioni per le articolazioni: locale e globale. Devi concatenare le rotazioni insieme per ottenere la trasformazione locale per il giunto.
Ciò che la documentazione COLLADA non distingue tra la rotazione locale del giunto e la rotazione globale del giunto. Ma nella maggior parte dei modelli che ho visto, le rotazioni possono avere un identificativo di rotate
(globale) o jointOrient
(locale).
Quando ignoro le rotazioni globali e utilizzo solo quelle locali, ottengo la posa di collegamento per il modello. Ma quando aggiungo le rotazioni globali alla trasformazione locale del giunto, cominciano a succedere cose strane.
Questo è senza utilizzare rotazioni globali:
E questo è con rotazioni globali:
In entrambe le immagini sto disegnando lo scheletro utilizzando linee, ma in il primo è invisibile perché le articolazioni sono all'interno della mesh. Nella seconda schermata i vertici sono dappertutto!
Per fare un confronto, questo è ciò che il secondo screenshot dovrebbe simile:
E 'difficile da vedere, ma si può vedere che i giunti siano nella posizione corretta nel secondo screenshot.
Ma ora la cosa strana. Se io trascuro l'associazione inversa pongono come specificato da COLLADA e invece prendo l'inverso della madre del locale comune di trasformare i tempi del locale comune trasformare, ottengo il seguente:
In questo screenshot sto disegnando un linea da ciascun vertice alle articolazioni che hanno influenza. Il fatto che ho la bind posa non è così strano, perché la formula diventa ora:
world_matrix * inverse_world_matrix * position * weight
Ma mi porta a sospettare che legano inversa di COLLADA pongono è nello spazio sbagliato.
Quindi la mia domanda è: in quale spazio COLLADA specifica la sua posizione inversa? E come posso trasformare la posa del binding inverso nello spazio che mi serve?
Hai letto "Skinning a Skeleton in COLLADA" nella sezione 1.4.1? La tua formula guarda fuori – jterrace