c++ - FbxSDK 打破常态

标签 c++ 3d normals fbx

我正在尝试导出蒙皮网格。由于某些原因,如果我将皮肤簇添加到网格,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);

我尝试了不同的贴图模组(例如 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);

关于c++ - FbxSDK 打破常态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33158607/

相关文章:

c++ - 为什么 `getline` 上的 `wifstream` 从 UTF-16 编码文件读取乱码输入?

c# - 从点云到实体网格

c++ - 如何控制像CAD程序一样的3D应用视点?

c++ - 法线贴图问题

opengl - CPU 到 GPU 法线映射

c++ - 可变参数模板值作为结构的模板参数

c++ - 为什么使用 exit() 被认为是不好的?

c++ - Bison 上下文中使用的 C++ 中的 union

c++ - 哪个处理器的成本更高?

javascript - 如何在 three.js 中计算闭合形状的法线?