2015-10-15 13 views
8

Sto tentando di esportare una mesh dalla pelle. Per alcuni motivi, FbxSDK interrompe le normali sui bordi dei segmenti se aggiungo un cluster di skin a una mesh. Senza una pelle tutto sembra perfettamente a posto.FbxSDK interrompe le normali

Esempio: enter image description here

Codice:

FbxLayerElementNormal *layerElementNormal = FbxLayerElementNormal::Create(mesh, ""); 
layerElementNormal->SetMappingMode(FbxLayerElement::eByControlPoint); 
layerElementNormal->SetReferenceMode(FbxLayerElement::eDirect); 

for (int vertIndex = 0; vertIndex < vertexCount; ++vertIndex) 
{ 
    PackedNormal normal = vertices[vertIndex].normal; 
    double x,y,z; 
    x = (((normal.data)  & 0xFF)/127.5f - 1.0f); 
    y = ((((normal.data) >> 8) & 0xFF)/127.5f - 1.0f); 
    z = ((((normal.data) >> 16) & 0xFF)/127.5f - 1.0f); 
    layerElementNormal->GetDirectArray().Add(FbxVector4(x,-y,z)); 
} 

layer->SetNormals(layerElementNormal); 

ho tryied diversi mods di mappatura (ad es eByPolygonVertex.) E mods di riferimento ma finora nessun aiuto. Sembra che le normali siano completamente ignorate se una maglia ha grappoli di pelle. Ho commentato il codice sopra e il modello scuoiato sembrava uno nell'immagine a sinistra.

Ho anche provato diversi software 3D (Maya 2015, Maya 2013 e 3ds Max 2013) per rivedere il modello esportato ma tutti mi danno gli stessi risultati.

P.S. questo problema ha effetto su qualsiasi mesh della pelle.

EDIT Sembra che questo problema è un bug in FBX cantiere: Autodesk Forum. Per bypassare il problema ho bisogno di "Transfer Attributes". Qualcuno può aiutare con questo?

+2

La cosa sulla foto è davvero ciò che penso sia, o devo visitare uno strizzacervelli? – SergeyA

+0

Questo è esattamente quello che pensi! – VenoMKO

+0

Questo va bene. Spiacente, non posso aiutare con la domanda vera, però. – SergeyA

risposta

0

Lo skin è un processo che richiede quattro componenti: x, y, z e peso. Per le normali, il quarto componente (peso) dovrebbe essere impostato su zero. Hai provato FbxVector4 (x, -y, z, 0) nel tuo codice? Prova anche
w = ((((normal.data) >> 24) & 0xFF)/127.5f - 1.0f);
e quindi utilizzando FbxVector4 (x, -y, z, w);

+0

Quello che voglio dire è: Stai lasciando cadere i primi 8 bit dei normali dati che potrebbero contenere informazioni utili w. –

+0

Grazie per la risposta. L'ultimo byte non è utilizzato e memorizza 0xFF. Ho provato a passare 1.0f, 0.0f e -1.0f come quarto componente, ma nulla è cambiato. – VenoMKO

Problemi correlati