NodeHelpers.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #pragma once
  2. #include <string>
  3. #include <sstream>
  4. #include <fbxsdk.h>
  5. #include <DirectXMath.h>
  6. inline std::wstring getNodeId(FbxNode* node) {
  7. auto nId = node->GetUniqueID();
  8. std::wstringstream strstream;
  9. strstream << nId;
  10. auto name = node->GetName();
  11. if (name) {
  12. strstream << L"_" << name;
  13. }
  14. return strstream.str();
  15. }
  16. const double Euler2Rad = 3.141592653589793238462 / 180;
  17. inline FbxMatrix GetGeometryTransformation(FbxNode* inNode)
  18. {
  19. if (!inNode)
  20. {
  21. throw std::exception("Null for mesh geometry");
  22. }
  23. const FbxVector4 lT = inNode->GetGeometricTranslation(FbxNode::eSourcePivot);
  24. const FbxVector4 lR = inNode->GetGeometricRotation(FbxNode::eSourcePivot);
  25. const FbxVector4 lS = inNode->GetGeometricScaling(FbxNode::eSourcePivot);
  26. return FbxMatrix(lT, lR, lS);
  27. }
  28. inline FbxMatrix ConvertToBabylonCoordinateSystem(const FbxMatrix& origin){
  29. FbxVector4 trans;
  30. FbxQuaternion rot;
  31. FbxVector4 shearing;
  32. FbxVector4 scaling;
  33. double sign;
  34. origin.GetElements(trans, rot, shearing, scaling, sign);
  35. trans[2] = -trans[2]; // This negate Z of Translation Component of the matrix
  36. rot[0] = -rot[0];
  37. rot[1] = -rot[1];
  38. return FbxMatrix (trans, rot, scaling);
  39. }
  40. //
  41. //inline FbxAMatrix CalculateGlobalTransform(FbxNode* pNode, const FbxTime& time = FBXSDK_TIME_INFINITE)
  42. //{
  43. // FbxAMatrix lTranlationM, lScalingM, lScalingPivotM, lScalingOffsetM, lRotationOffsetM, lRotationPivotM, \
  44. // lPreRotationM, lRotationM, lPostRotationM, lTransform;
  45. //
  46. // FbxAMatrix lParentGX, lGlobalT, lGlobalRS;
  47. //
  48. // if (!pNode)
  49. // {
  50. // lTransform.SetIdentity();
  51. // return lTransform;
  52. // }
  53. //
  54. // // Construct translation matrix
  55. // FbxVector4 lTranslation = pNode->LclTranslation.EvaluateValue(time);
  56. // lTranlationM.SetT(lTranslation);
  57. //
  58. // // Construct rotation matrices
  59. // FbxVector4 lRotation = pNode->LclRotation.EvaluateValue(time);
  60. // FbxVector4 lPreRotation = pNode->PreRotation.EvaluateValue(time);
  61. // FbxVector4 lPostRotation = pNode->PostRotation.EvaluateValue(time);
  62. // lRotationM.SetR(lRotation);
  63. // lPreRotationM.SetR(lPreRotation);
  64. // lPostRotationM.SetR(lPostRotation);
  65. //
  66. // // Construct scaling matrix
  67. // FbxVector4 lScaling = pNode->LclScaling.EvaluateValue(time);
  68. // lScalingM.SetS(lScaling);
  69. //
  70. // // Construct offset and pivot matrices
  71. // FbxVector4 lScalingOffset = pNode->ScalingOffset.EvaluateValue(time);
  72. // FbxVector4 lScalingPivot = pNode->ScalingPivot.EvaluateValue(time);
  73. // FbxVector4 lRotationOffset = pNode->RotationOffset.EvaluateValue(time);
  74. // FbxVector4 lRotationPivot = pNode->RotationPivot.EvaluateValue(time);
  75. // lScalingOffsetM.SetT(lScalingOffset);
  76. // lScalingPivotM.SetT(lScalingPivot);
  77. // lRotationOffsetM.SetT(lRotationOffset);
  78. // lRotationPivotM.SetT(lRotationPivot);
  79. //
  80. // // Calculate the global transform matrix of the parent node
  81. // FbxNode* lParentNode = pNode->GetParent();
  82. // if (lParentNode)
  83. // {
  84. // lParentGX = CalculateGlobalTransform(lParentNode);
  85. // }
  86. // else
  87. // {
  88. // lParentGX.SetIdentity();
  89. // }
  90. //
  91. // //Construct Global Rotation
  92. // FbxAMatrix lLRM, lParentGRM;
  93. // FbxVector4 lParentGR = lParentGX.GetR();
  94. // lParentGRM.SetR(lParentGR);
  95. // lLRM = lPreRotationM * lRotationM * lPostRotationM;
  96. //
  97. // //Construct Global Shear*Scaling
  98. // //FBX SDK does not support shear, to patch this, we use:
  99. // //Shear*Scaling = RotationMatrix.Inverse * TranslationMatrix.Inverse * WholeTranformMatrix
  100. // FbxAMatrix lLSM, lParentGSM, lParentGRSM, lParentTM;
  101. // FbxVector4 lParentGT = lParentGX.GetT();
  102. // lParentTM.SetT(lParentGT);
  103. // lParentGRSM = lParentTM.Inverse() * lParentGX;
  104. // lParentGSM = lParentGRM.Inverse() * lParentGRSM;
  105. // lLSM = lScalingM;
  106. //
  107. // //Do not consider translation now
  108. // FbxTransform::EInheritType lInheritType = pNode->InheritType.EvaluateValue(time);
  109. // if (lInheritType == FbxTransform::eInheritRrSs)
  110. // {
  111. // lGlobalRS = lParentGRM * lLRM * lParentGSM * lLSM;
  112. // }
  113. // else if (lInheritType == FbxTransform::eInheritRSrs)
  114. // {
  115. // lGlobalRS = lParentGRM * lParentGSM * lLRM * lLSM;
  116. // }
  117. // else if (lInheritType == FbxTransform::eInheritRrs)
  118. // {
  119. // FbxAMatrix lParentLSM;
  120. // FbxVector4 lParentLS = lParentNode->LclScaling.EvaluateValue(time);
  121. // lParentLSM.SetS(lParentLS);
  122. //
  123. // FbxAMatrix lParentGSM_noLocal = lParentGSM * lParentLSM.Inverse();
  124. // lGlobalRS = lParentGRM * lLRM * lParentGSM_noLocal * lLSM;
  125. // }
  126. // else
  127. // {
  128. // FBXSDK_printf("error, unknown inherit type! \n");
  129. // }
  130. //
  131. // // Construct translation matrix
  132. // // Calculate the local transform matrix
  133. // lTransform = lTranlationM * lRotationOffsetM * lRotationPivotM * lPreRotationM * lRotationM * lPostRotationM * lRotationPivotM.Inverse()\
  134. // * lScalingOffsetM * lScalingPivotM * lScalingM * lScalingPivotM.Inverse();
  135. // FbxVector4 lLocalTWithAllPivotAndOffsetInfo = lTransform.GetT();
  136. // // Calculate global translation vector according to:
  137. // // GlobalTranslation = ParentGlobalTransform * LocalTranslationWithPivotAndOffsetInfo
  138. // FbxVector4 lGlobalTranslation = lParentGX.MultT(lLocalTWithAllPivotAndOffsetInfo);
  139. // lGlobalT.SetT(lGlobalTranslation);
  140. //
  141. // //Construct the whole global transform
  142. // lTransform = lGlobalT * lGlobalRS;
  143. //
  144. // return lTransform;
  145. //}
  146. //
  147. //inline FbxAMatrix CalculateLocalTransform(FbxNode* pNode, const FbxTime& time = FBXSDK_TIME_INFINITE)
  148. //{
  149. // FbxAMatrix lTranlationM, lScalingM, lScalingPivotM, lScalingOffsetM, lRotationOffsetM, lRotationPivotM, \
  150. // lPreRotationM, lRotationM, lPostRotationM, lTransform;
  151. //
  152. //
  153. // if (!pNode)
  154. // {
  155. // lTransform.SetIdentity();
  156. // return lTransform;
  157. // }
  158. //
  159. // // Construct translation matrix
  160. // FbxVector4 lTranslation = pNode->LclTranslation.EvaluateValue(time);
  161. // lTranlationM.SetT(lTranslation);
  162. //
  163. // // Construct rotation matrices
  164. // FbxVector4 lRotation = pNode->LclRotation.EvaluateValue(time);
  165. // FbxVector4 lPreRotation = pNode->PreRotation.EvaluateValue(time);
  166. // FbxVector4 lPostRotation = pNode->PostRotation.EvaluateValue(time);
  167. // lRotationM.SetR(lRotation);
  168. // lPreRotationM.SetR(lPreRotation);
  169. // lPostRotationM.SetR(lPostRotation);
  170. //
  171. // // Construct scaling matrix
  172. // FbxVector4 lScaling = pNode->LclScaling.EvaluateValue(time);
  173. // lScalingM.SetS(lScaling);
  174. //
  175. // // Construct offset and pivot matrices
  176. // FbxVector4 lScalingOffset = pNode->ScalingOffset.EvaluateValue(time);
  177. // FbxVector4 lScalingPivot = pNode->ScalingPivot.EvaluateValue(time);
  178. // FbxVector4 lRotationOffset = pNode->RotationOffset.EvaluateValue(time);
  179. // FbxVector4 lRotationPivot = pNode->RotationPivot.EvaluateValue(time);
  180. // lScalingOffsetM.SetT(lScalingOffset);
  181. // lScalingPivotM.SetT(lScalingPivot);
  182. // lRotationOffsetM.SetT(lRotationOffset);
  183. // lRotationPivotM.SetT(lRotationPivot);
  184. //
  185. //
  186. //
  187. //
  188. // // Construct translation matrix
  189. // // Calculate the local transform matrix
  190. // lTransform = lTranlationM * lRotationOffsetM * lRotationPivotM * lPreRotationM * lRotationM * lPostRotationM * lRotationPivotM.Inverse()\
  191. // * lScalingOffsetM * lScalingPivotM * lScalingM * lScalingPivotM.Inverse();
  192. //
  193. //
  194. // return lTransform;
  195. //}