diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index 45e5520dce..227557ed8f 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -402,6 +402,7 @@ int main(int argc, char** argv) { ("site-local-placement", "Place elements locally in the IfcSite coordinate system, instead of placing " "them in the IFC global coords. Applicable for OBJ and DAE output.") + ("use-z-up", "Z UP. default Y UP,Applicable for OBJ output.") ("building-local-placement", "Similar to --site-local-placement, but placing elements in locally in the parent IfcBuilding coord system") ("precision", po::value(&precision)->default_value(SerializerSettings::DEFAULT_PRECISION), @@ -467,6 +468,7 @@ int main(int argc, char** argv) { const bool use_material_names = vmap.count("use-material-names") != 0; const bool use_element_types = vmap.count("use-element-types") != 0; const bool use_element_hierarchy = vmap.count("use-element-hierarchy") != 0; + const bool use_z_up = vmap.count("use-z-up") != 0; const bool no_normals = vmap.count("no-normals") != 0; const bool center_model = vmap.count("center-model") != 0; const bool center_model_geometry = vmap.count("center-model-geometry") != 0; @@ -740,6 +742,7 @@ int main(int argc, char** argv) { settings.set(SerializerSettings::USE_ELEMENT_NAMES, use_element_names); settings.set(SerializerSettings::USE_ELEMENT_GUIDS, use_element_guids); + settings.set(SerializerSettings::USE_Z_UP, use_z_up); settings.set(SerializerSettings::USE_ELEMENT_STEPIDS, use_element_stepids); settings.set(SerializerSettings::USE_MATERIAL_NAMES, use_material_names); settings.set(SerializerSettings::USE_ELEMENT_TYPES, use_element_types); diff --git a/src/serializers/GeometrySerializer.h b/src/serializers/GeometrySerializer.h index 3a0c88e181..5bcf8d1854 100644 --- a/src/serializers/GeometrySerializer.h +++ b/src/serializers/GeometrySerializer.h @@ -53,8 +53,11 @@ public: /// Use step ids for naming elements. /// Applicable for OBJ, DAE, and SVG output. USE_ELEMENT_STEPIDS = 1 << (IfcGeom::IteratorSettings::NUM_SETTINGS + 6), + /// Use step Z UP . + /// Applicable for OBJ output. + USE_Z_UP = 1 << (IfcGeom::IteratorSettings::NUM_SETTINGS + 7), /// Number of different setting flags. - NUM_SETTINGS = 6 + NUM_SETTINGS = 7 }; SerializerSettings() diff --git a/src/serializers/WavefrontObjSerializer.cpp b/src/serializers/WavefrontObjSerializer.cpp index 0b5de33548..2ffd24cad6 100644 --- a/src/serializers/WavefrontObjSerializer.cpp +++ b/src/serializers/WavefrontObjSerializer.cpp @@ -88,7 +88,11 @@ void WaveFrontOBJSerializer::write(const IfcGeom::TriangulationElement* { obj_stream << "g " << object_id(o) << "\n"; obj_stream << "s 1" << "\n"; - + bool isyup = true; + if (settings().get(SerializerSettings::USE_Z_UP) ){ //settings().get(SerializerSettings::USE_Z_UP) + isyup = false; + } + const IfcGeom::Representation::Triangulation& mesh = o->geometry(); const int vcount = (int)mesh.verts().size() / 3; @@ -96,7 +100,12 @@ void WaveFrontOBJSerializer::write(const IfcGeom::TriangulationElement* const real_t x = *(it++); const real_t y = *(it++); const real_t z = *(it++); - obj_stream << "v " << x << " " << y << " " << z << "\n"; + + if(isyup){ + obj_stream << "v " << x << " " << y << " " << z << "\n"; + }else{ + obj_stream << "v " << -x << " " << z << " " << y << "\n"; + } } for ( std::vector::const_iterator it = mesh.normals().begin(); it != mesh.normals().end(); ) {