2015-10-15 18 views
8

Ich versuche, ein enthäutetes Netz zu exportieren. Aus einigen Gründen bricht FbxSDK die Normalen an Kanten von Segmenten, wenn ich einem Netz einen Hautcluster hinzufüge. Ohne Haut sieht alles total gut aus.FbxSDK bricht Normalen

Beispiel: enter image description here

Code:

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); 

ich verschiedenen Mapping Mods tryied (zB eByPolygonVertex.) Und Referenz-Mods aber bisher keine Hilfe. Scheint, dass Normalen vollständig ignoriert werden, wenn ein Mesh Hautcluster hat. Ich habe den obigen Code auskommentiert und das gehäutete Modell sah aus wie auf dem linken Bild.

Ich habe auch verschiedene 3D-Software (Maya 2015, Maya 2013 und 3ds Max 2013) getestet, um das exportierte Modell zu überprüfen, aber alle von ihnen geben mir die gleichen Ergebnisse.

P.S. Dieses Problem betrifft alle gehäuteten Netze.

EDIT scheint dieses Problem um einen Fehler in FBX-Pipeline ist: Autodesk Forum. Um das Problem zu umgehen, muss ich "Attribute übertragen". Kann mir jemand helfen?

+2

Ist das Ding auf dem Bild wirklich, was ich denke, oder muss ich einen Psychiater besuchen? – SergeyA

+0

Genau das denkst du! – VenoMKO

+0

Das ist gut. Tut mir leid, kann aber nicht mit der eigentlichen Frage helfen. – SergeyA

Antwort

0

Skinning ist ein Prozess, der vier Komponenten erfordert: x, y, z und Gewicht. Bei Normalen sollte die vierte Komponente (Gewicht) auf Null gesetzt werden. Hast du FbxVector4 (x, -y, z, 0) in deinem Code getestet? Versuchen Sie auch
w = ((((normal.data) >> 24) & 0xFF)/127.5f - 1.0f);
und dann mit FbxVector4 (x, -y, z, w);

+0

Was ich sagen möchte ist: Sie fallen die ersten 8 Bits der normal.data, die nützliche w Informationen enthalten könnte. –

+0

Danke für Ihre Antwort. Das letzte Byte ist nicht belegt und speichert 0xFF. Ich habe versucht, 1.0f, 0.0f und -1.0f als vierte Komponente zu übergeben, aber nichts hat sich geändert. – VenoMKO