2015-10-15 10 views
8

Я пытаюсь экспортировать скелетную сетку. По некоторым причинам FbxSDK разбивает нормали на ребрах сегментов, если я добавляю скин-кластер в сетку. Без кожи все выглядит совершенно нормально.FbxSDK нарушает нормальные

Пример: enter image description here

Код:

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

I tryied различных модов отображения (например, eByPolygonVertex.) И эталонные модов, но до сих пор нет помощи. Похоже, что нормали полностью игнорируются, если сетка имеет кластеры кожи. Я прокомментировал код выше, и скин-модель была похожа на изображение слева.

Я также попробовал различные 3d-программы (Maya 2015, Maya 2013 и 3ds Max 2013), чтобы просмотреть экспортированную модель, но все они дают мне те же результаты.

P.S. эта проблема затрагивает любую скелетную сетку.

EDIT Кажется эта проблема является ошибка в трубопроводе FBX: Autodesk Forum. Чтобы обойти проблему, мне нужно «Перенести атрибуты». Может кто-нибудь помочь с этим?

+2

Действительно ли это на картинке, что я думаю, или мне нужно посетить термоусадочную пленку? – SergeyA

+0

Это именно то, что вы думаете! – VenoMKO

+0

Это хорошо. Извините, но не могу помочь с реальным вопросом. – SergeyA

ответ

0

Skinning - это процесс, который требует четырех компонентов: x, y, z и веса. Для нормалей четвертый компонент (вес) должен быть равен нулю. Вы пробовали FbxVector4 (x, -y, z, 0) в своем коде? Также попробуйте
w = (((normal.data) >> 24) & 0xFF)/127.5f - 1.0f);
, а затем с использованием FbxVector4 (x, -y, z, w);

+0

Что я хочу сказать: Выбрасываете первые 8 бит normal.data, которые могут содержать полезную информацию w. –

+0

Спасибо за ваш ответ. Последний байт не используется и сохраняет 0xFF. Я попытался передать 1.0f, 0.0f и -1.0f в качестве 4-го компонента, но ничего не изменилось. – VenoMKO