usd rotateXYZop

This commit is contained in:
D4ve-R
2023-05-18 14:36:22 +02:00
parent 9b9dce33a1
commit 8723d14aee
2 changed files with 25 additions and 3 deletions
+24 -3
View File
@@ -30,6 +30,8 @@
#include "pxr/usd/usdShade/shader.h"
#include "pxr/usd/usdShade/materialBindingAPI.h"
#include <math.h>
USDSerializer::USDSerializer(const std::string& out_filename, const SerializerSettings& settings):
WriteOnlyGeometrySerializer(settings),
filename_(out_filename)
@@ -102,6 +104,24 @@ std::vector<pxr::UsdShadeMaterial> USDSerializer::createMaterials(const std::vec
return materials;
}
pxr::GfVec3f USDSerializer::rotation_degrees_from_matrix(const std::vector<double>& matrix) const {
const double epsilon = 1e-6;
double angleX, angleY, angleZ;
angleX = atan2(-matrix[5], matrix[8]);
if (std::abs(std::abs(matrix[5]) - 1.0) < epsilon) {
angleZ = 0.0;
angleY = atan2(matrix[6], matrix[0]);
} else {
angleZ = atan2(matrix[1], matrix[4]);
angleY = atan2(matrix[2], matrix[8]);
}
return pxr::GfVec3f(static_cast<float>(angleX * 180.0 / M_PI),
static_cast<float>(angleY * 180.0 / M_PI),
static_cast<float>(angleZ * 180.0 / M_PI));
}
void USDSerializer::writeHeader() {
stage_->GetRootLayer()->SetComment("File generated by IfcOpenShell " + std::string(IFCOPENSHELL_VERSION));
}
@@ -126,12 +146,13 @@ void USDSerializer::write(const IfcGeom::TriangulationElement* o) {
auto usd_mesh = pxr::UsdGeomMesh::Define(stage_, pxr::SdfPath("/World/" + name));
usd_mesh.AddTranslateOp().Set(pxr::GfVec3d(m[9], m[10], m[11]));
usd_mesh.AddRotateXYZOp().Set(rotation_degrees_from_matrix(m));
pxr::VtVec3fArray points;
for(std::size_t i = 0; i < verts.size(); i+=3) {
points.push_back(pxr::GfVec3f(static_cast<float>(verts[i] * m[0] + verts[i+1] * m[3] + verts[i+2] * m[6]),
static_cast<float>(verts[i] * m[1] + verts[i+1] * m[4] + verts[i+2] * m[7]),
static_cast<float>(verts[i] * m[2] + verts[i+1] * m[5] + verts[i+2] * m[8])));
points.push_back(pxr::GfVec3f(static_cast<float>(verts[i]),
static_cast<float>(verts[i+1]),
static_cast<float>(verts[i+2])));
}
usd_mesh.CreatePointsAttr().Set(points);
+1
View File
@@ -66,6 +66,7 @@ private:
std::map<std::string, pxr::UsdShadeMaterial> materials_;
std::vector<pxr::UsdShadeMaterial> createMaterials(const std::vector<IfcGeom::Material>&);
pxr::GfVec3f rotation_degrees_from_matrix(const std::vector<double>&) const;
public:
USDSerializer(const std::string&, const SerializerSettings&);
virtual ~USDSerializer();