@@ -55,9 +55,9 @@ public static ModelExporter Create ()
55
55
Dictionary < string , FbxTexture > TextureMap = new Dictionary < string , FbxTexture > ( ) ;
56
56
57
57
/// <summary>
58
- /// Export the mesh's UVs using layer 0.
58
+ /// Export the mesh's attributes using layer 0.
59
59
/// </summary>
60
- public void ExportUVsAndNormals ( MeshInfo mesh , FbxMesh fbxMesh , int [ ] unmergedTriangles )
60
+ public void ExportComponentAttributes ( MeshInfo mesh , FbxMesh fbxMesh , int [ ] unmergedTriangles )
61
61
{
62
62
// Set the normals on Layer 0.
63
63
FbxLayer fbxLayer = fbxMesh . GetLayer ( 0 /* default layer */ ) ;
@@ -68,17 +68,14 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
68
68
69
69
using ( var fbxLayerElement = FbxLayerElementNormal . Create ( fbxMesh , "Normals" ) ) {
70
70
fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygonVertex ) ;
71
-
72
71
fbxLayerElement . SetReferenceMode ( FbxLayerElement . EReferenceMode . eDirect ) ;
73
72
74
73
// Add one normal per each vertex face index (3 per triangle)
75
74
FbxLayerElementArray fbxElementArray = fbxLayerElement . GetDirectArray ( ) ;
76
75
77
76
for ( int n = 0 ; n < unmergedTriangles . Length ; n ++ ) {
78
77
int unityTriangle = unmergedTriangles [ n ] ;
79
- fbxElementArray . Add ( new FbxVector4 ( - mesh . Normals [ unityTriangle ] [ 0 ] ,
80
- mesh . Normals [ unityTriangle ] [ 1 ] ,
81
- mesh . Normals [ unityTriangle ] [ 2 ] ) ) ;
78
+ fbxElementArray . Add ( CreateRightHandedFbxVector4 ( mesh . Normals [ unityTriangle ] ) ) ;
82
79
}
83
80
84
81
fbxLayer . SetNormals ( fbxLayerElement ) ;
@@ -106,6 +103,57 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
106
103
}
107
104
fbxLayer . SetUVs ( fbxLayerElement , FbxLayerElement . EType . eTextureDiffuse ) ;
108
105
}
106
+
107
+ /// Set the binormals on Layer 0.
108
+ using ( var fbxLayerElement = FbxLayerElementBinormal . Create ( fbxMesh , "Binormals" ) )
109
+ {
110
+ fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygonVertex ) ;
111
+ fbxLayerElement . SetReferenceMode ( FbxLayerElement . EReferenceMode . eDirect ) ;
112
+
113
+ // Add one normal per each vertex face index (3 per triangle)
114
+ FbxLayerElementArray fbxElementArray = fbxLayerElement . GetDirectArray ( ) ;
115
+
116
+ for ( int n = 0 ; n < unmergedTriangles . Length ; n ++ ) {
117
+ int unityTriangle = unmergedTriangles [ n ] ;
118
+ fbxElementArray . Add ( CreateRightHandedFbxVector4 ( mesh . Binormals [ unityTriangle ] ) ) ;
119
+ }
120
+ fbxLayer . SetBinormals ( fbxLayerElement ) ;
121
+ }
122
+
123
+ /// Set the tangents on Layer 0.
124
+ using ( var fbxLayerElement = FbxLayerElementTangent . Create ( fbxMesh , "Tangents" ) )
125
+ {
126
+ fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygonVertex ) ;
127
+ fbxLayerElement . SetReferenceMode ( FbxLayerElement . EReferenceMode . eDirect ) ;
128
+
129
+ // Add one normal per each vertex face index (3 per triangle)
130
+ FbxLayerElementArray fbxElementArray = fbxLayerElement . GetDirectArray ( ) ;
131
+
132
+ for ( int n = 0 ; n < unmergedTriangles . Length ; n ++ ) {
133
+ int unityTriangle = unmergedTriangles [ n ] ;
134
+ fbxElementArray . Add ( CreateRightHandedFbxVector4 (
135
+ new Vector3 (
136
+ mesh . Tangents [ unityTriangle ] [ 0 ] ,
137
+ mesh . Tangents [ unityTriangle ] [ 1 ] ,
138
+ mesh . Tangents [ unityTriangle ] [ 2 ]
139
+ ) ) ) ;
140
+ }
141
+ fbxLayer . SetTangents ( fbxLayerElement ) ;
142
+ }
143
+ }
144
+
145
+ /// <summary>
146
+ /// Takes in a left-handed Vector3, and returns a right-handed FbxVector4.
147
+ /// Helper for ExportComponentAttributes()
148
+ /// </summary>
149
+ /// <returns>The right-handed FbxVector4.</returns>
150
+ private FbxVector4 CreateRightHandedFbxVector4 ( Vector3 leftHandedVector )
151
+ {
152
+ // negating the x component of the vector converts it from left to right handed coordinates
153
+ return new FbxVector4 (
154
+ - leftHandedVector [ 0 ] ,
155
+ leftHandedVector [ 1 ] ,
156
+ leftHandedVector [ 2 ] ) ;
109
157
}
110
158
111
159
/// <summary>
@@ -303,7 +351,7 @@ meshInfo.Vertices [v].z
303
351
fbxMesh . EndPolygon ( ) ;
304
352
}
305
353
306
- ExportUVsAndNormals ( meshInfo , fbxMesh , unmergedTriangles ) ;
354
+ ExportComponentAttributes ( meshInfo , fbxMesh , unmergedTriangles ) ;
307
355
308
356
// set the fbxNode containing the mesh
309
357
fbxNode . SetNodeAttribute ( fbxMesh ) ;
@@ -604,7 +652,8 @@ public Vector3 [] Binormals {
604
652
/// NOTE: LINQ
605
653
/// return mesh.normals.Zip (mesh.tangents, (first, second)
606
654
/// => Math.cross (normal, tangent.xyz) * tangent.w
607
- if ( m_Binormals . Length == 0 ) {
655
+ if ( m_Binormals == null || m_Binormals . Length == 0 )
656
+ {
608
657
m_Binormals = new Vector3 [ mesh . normals . Length ] ;
609
658
610
659
for ( int i = 0 ; i < mesh . normals . Length ; i ++ )
0 commit comments