- fbx: read local transforms (different modes of rotation not yet implemented, though).

pull/14/head
Alexander Gessler 2012-07-05 17:06:15 +02:00
parent 3179e949bb
commit 4db113395c
3 changed files with 50 additions and 3 deletions

View File

@ -154,7 +154,7 @@ private:
nd->mName.Set(model->Name()); nd->mName.Set(model->Name());
nd->mParent = &parent; nd->mParent = &parent;
// XXX handle transformation ConvertTransformation(*model,*nd);
ConvertModel(*model, *nd); ConvertModel(*model, *nd);
ConvertNodes(model->ID(), *nd); ConvertNodes(model->ID(), *nd);
@ -170,6 +170,46 @@ private:
} }
// ------------------------------------------------------------------------------------------------
void ConvertTransformation(const Model& model, aiNode& nd)
{
const PropertyTable& props = model.Props();
bool ok;
aiVector3D Translation = PropertyGet<aiVector3D>(props,"Lcl Translation",ok);
if(!ok) {
Translation = aiVector3D(0.0f,0.0f,0.0f);
}
aiVector3D Scaling = PropertyGet<aiVector3D>(props,"Lcl Scaling",ok);
if(!ok) {
Scaling = aiVector3D(1.0f,1.0f,1.0f);
}
// XXX euler angles, radians, xyz order?
aiVector3D Rotation = PropertyGet<aiVector3D>(props,"Lcl Rotation",ok);
if(!ok) {
Rotation = aiVector3D(0.0f,0.0f,0.0f);
}
aiMatrix4x4 temp;
nd.mTransformation = aiMatrix4x4::Scaling(Scaling,temp);
if(fabs(Rotation.x) > 1e-6f) {
nd.mTransformation *= aiMatrix4x4::RotationX(Rotation.x,temp);
}
if(fabs(Rotation.y) > 1e-6f) {
nd.mTransformation *= aiMatrix4x4::RotationY(Rotation.y,temp);
}
if(fabs(Rotation.z) > 1e-6f) {
nd.mTransformation *= aiMatrix4x4::RotationZ(Rotation.z,temp);
}
nd.mTransformation.a4 = Translation.x;
nd.mTransformation.b4 = Translation.y;
nd.mTransformation.c4 = Translation.z;
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
void ConvertModel(const Model& model, aiNode& nd) void ConvertModel(const Model& model, aiNode& nd)
{ {

View File

@ -74,6 +74,7 @@ Model::Model(uint64_t id, const Element& element, const Document& doc, const std
culling = ParseTokenAsString(GetRequiredToken(*Culling,0)); culling = ParseTokenAsString(GetRequiredToken(*Culling,0));
} }
props = GetPropertyTable(doc,"Model.FbxNode",element,sc);
ResolveLinks(element,doc); ResolveLinks(element,doc);
} }

View File

@ -91,7 +91,14 @@ Property* ReadTypedProperty(const Element& element)
else if (!strcmp(cs,"ULongLong")) { else if (!strcmp(cs,"ULongLong")) {
return new TypedProperty<uint64_t>(ParseTokenAsID(*tok[4])); return new TypedProperty<uint64_t>(ParseTokenAsID(*tok[4]));
} }
else if (!strcmp(cs,"Vector3D") || !strcmp(cs,"ColorRGB") || !strcmp(cs,"Vector") || !strcmp(cs,"Color")) { else if (!strcmp(cs,"Vector3D") ||
!strcmp(cs,"ColorRGB") ||
!strcmp(cs,"Vector") ||
!strcmp(cs,"Color") ||
!strcmp(cs,"Lcl Translation") ||
!strcmp(cs,"Lcl Rotation") ||
!strcmp(cs,"Lcl Scaling")
) {
return new TypedProperty<aiVector3D>(aiVector3D( return new TypedProperty<aiVector3D>(aiVector3D(
ParseTokenAsFloat(*tok[4]), ParseTokenAsFloat(*tok[4]),
ParseTokenAsFloat(*tok[5]), ParseTokenAsFloat(*tok[5]),
@ -187,7 +194,6 @@ const Property* PropertyTable::Get(const std::string& name) const
} }
} }
ai_assert((*it).second);
return (*it).second; return (*it).second;
} }