Add correction of fbx model rotation (#5494)
parent
727774f181
commit
fcb1444b84
|
@ -76,6 +76,53 @@ using namespace Util;
|
||||||
|
|
||||||
#define CONVERT_FBX_TIME(time) static_cast<double>(time) / 46186158000LL
|
#define CONVERT_FBX_TIME(time) static_cast<double>(time) / 46186158000LL
|
||||||
|
|
||||||
|
static void correctRootTransform(const aiScene *scene) {
|
||||||
|
if (scene == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scene->mMetaData == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t UpAxis = 1, UpAxisSign = 1, FrontAxis = 2, FrontAxisSign = 1, CoordAxis = 0, CoordAxisSign = 1;
|
||||||
|
double UnitScaleFactor = 1.0;
|
||||||
|
for (unsigned MetadataIndex = 0; MetadataIndex < scene->mMetaData->mNumProperties; ++MetadataIndex) {
|
||||||
|
if (strcmp(scene->mMetaData->mKeys[MetadataIndex].C_Str(), "UpAxis") == 0) {
|
||||||
|
scene->mMetaData->Get<int32_t>(MetadataIndex, UpAxis);
|
||||||
|
}
|
||||||
|
if (strcmp(scene->mMetaData->mKeys[MetadataIndex].C_Str(), "UpAxisSign") == 0) {
|
||||||
|
scene->mMetaData->Get<int32_t>(MetadataIndex, UpAxisSign);
|
||||||
|
}
|
||||||
|
if (strcmp(scene->mMetaData->mKeys[MetadataIndex].C_Str(), "FrontAxis") == 0) {
|
||||||
|
scene->mMetaData->Get<int32_t>(MetadataIndex, FrontAxis);
|
||||||
|
}
|
||||||
|
if (strcmp(scene->mMetaData->mKeys[MetadataIndex].C_Str(), "FrontAxisSign") == 0) {
|
||||||
|
scene->mMetaData->Get<int32_t>(MetadataIndex, FrontAxisSign);
|
||||||
|
}
|
||||||
|
if (strcmp(scene->mMetaData->mKeys[MetadataIndex].C_Str(), "CoordAxis") == 0) {
|
||||||
|
scene->mMetaData->Get<int32_t>(MetadataIndex, CoordAxis);
|
||||||
|
}
|
||||||
|
if (strcmp(scene->mMetaData->mKeys[MetadataIndex].C_Str(), "CoordAxisSign") == 0) {
|
||||||
|
scene->mMetaData->Get<int32_t>(MetadataIndex, CoordAxisSign);
|
||||||
|
}
|
||||||
|
if (strcmp(scene->mMetaData->mKeys[MetadataIndex].C_Str(), "UnitScaleFactor") == 0) {
|
||||||
|
scene->mMetaData->Get<double>(MetadataIndex, UnitScaleFactor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aiVector3D upVec, forwardVec, rightVec;
|
||||||
|
upVec[UpAxis] = UpAxisSign * static_cast<float>(UnitScaleFactor);
|
||||||
|
forwardVec[FrontAxis] = FrontAxisSign * static_cast<float>(UnitScaleFactor);
|
||||||
|
rightVec[CoordAxis] = CoordAxisSign * (float)UnitScaleFactor;
|
||||||
|
|
||||||
|
aiMatrix4x4 mat(rightVec.x, rightVec.y, rightVec.z, 0.0f,
|
||||||
|
upVec.x, upVec.y, upVec.z, 0.0f,
|
||||||
|
forwardVec.x, forwardVec.y, forwardVec.z, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
scene->mRootNode->mTransformation *= mat;
|
||||||
|
}
|
||||||
|
|
||||||
FBXConverter::FBXConverter(aiScene *out, const Document &doc, bool removeEmptyBones) :
|
FBXConverter::FBXConverter(aiScene *out, const Document &doc, bool removeEmptyBones) :
|
||||||
defaultMaterialIndex(),
|
defaultMaterialIndex(),
|
||||||
mMeshes(),
|
mMeshes(),
|
||||||
|
@ -133,6 +180,8 @@ FBXConverter::FBXConverter(aiScene *out, const Document &doc, bool removeEmptyBo
|
||||||
// need not contain geometry (i.e. camera animations, raw armatures).
|
// need not contain geometry (i.e. camera animations, raw armatures).
|
||||||
if (out->mNumMeshes == 0) {
|
if (out->mNumMeshes == 0) {
|
||||||
out->mFlags |= AI_SCENE_FLAGS_INCOMPLETE;
|
out->mFlags |= AI_SCENE_FLAGS_INCOMPLETE;
|
||||||
|
} else {
|
||||||
|
correctRootTransform(mSceneOut);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue