Я пытаюсь экспортировать очищенную сетку. По некоторым причинам FbxSDK нарушает нормали по краям сегментов, если я добавляю кластер кожи в сетку. Без кожи все выглядит совершенно нормально.
Код:
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);
Я пробовал разные способы отображения (например, eByPolygonVertex
) и справочные моды, но пока не помогают. Кажется, что нормали полностью игнорируются, если сетка имеет кластеры кожи. Я закомментировал приведенный выше код, и модель со скином выглядела так, как на левом изображении.
Я также попробовал различные 3D-программы (Maya 2015, Maya 2013 и 3ds Max 2013) для проверки экспортированной модели, но все они дают мне одинаковые результаты.
Постскриптум эта проблема затрагивает любую очищенную сетку.
РЕДАКТИРОВАТЬ
Кажется, эта проблема — ошибка в конвейере FBX: Autodesk Forum. Чтобы обойти проблему, мне нужно «Передача атрибутов». Может кто-нибудь помочь с этим?
Скиннинг — это процесс, который требует четырех компонентов: x, y, z и веса. Для нормалей четвертый компонент (вес) должен быть установлен в ноль. Вы пробовали FbxVector4 (x, -y, z, 0) в своем коде? Также попробуйте
w = ((((normal.data) >> 24) & 0xFF) / 127,5f — 1,0f);
и затем с помощью FbxVector4 (x, -y, z, w);
Других решений пока нет …