Browse Source

SteamVR Export

Johannes Kreutz 2 years ago
parent
commit
da04e123cf

+ 2 - 0
trackpoint-app/include/OpenScadRenderer.hpp

@@ -2,6 +2,7 @@
 
 // Include modules
 #include "OptiTrackPoint.hpp"
+#include "SteamVRTrackPoint.hpp"
 
 // Include dependencies
 #include <vector>
@@ -10,4 +11,5 @@ class OpenScadRenderer {
 public:
   static bool openScadAvailable();
   void renderOptiTrack(std::vector<OptiTrackPoint*> points);
+  void renderSteamVRTrack(std::vector<SteamVRTrackPoint*> points);
 };

+ 1 - 0
trackpoint-app/include/defaults.hpp

@@ -6,5 +6,6 @@
 #define OPTITRACK_DEFAULT_RADIUS 1.0
 
 #define STEAMVR_DEFAULT_LENGTH 10.0
+#define STEAMVR_CONSTANT_RADIUS 3.5
 
 #define ACTIONPOINT_DEFAULT_IDENFIFIER "point0"

+ 22 - 0
trackpoint-app/src/OpenScadRenderer.cpp

@@ -16,8 +16,15 @@
 
 const char* openScadBase =
   "$fn = 100;\n"
+  "use </tmp/threads_2.5.scad>\n"
   "module optiTrackPointBase(translation, rotation, length, radius) {\n"
   "translate(translation) rotate(rotation) cylinder(length, radius, radius, false);\n"
+  "}\n"
+  "module steamVrTrackPointBase(translation, rotation, length) {\n"
+  "translate(translation) rotate(rotation) {\n"
+  "cylinder(length, 3.5, 3.5, false);\n"
+  "translate([0, 0, length]) english_thread(diameter=1/4, threads_per_inch=20, length=0.393701);\n"
+  "}\n"
   "}\n";
 
 bool OpenScadRenderer::openScadAvailable() {
@@ -40,3 +47,18 @@ void OpenScadRenderer::renderOptiTrack(std::vector<OptiTrackPoint*> points) {
   std::string command = openScadPath + " -o " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_optitrack.3mf " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_optitrack.scad";
   system(command.c_str());
 }
+
+void OpenScadRenderer::renderSteamVRTrack(std::vector<SteamVRTrackPoint*> points) {
+  std::ofstream scadFile;
+  scadFile.open(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_steamvrtrack.scad");
+  scadFile << openScadBase;
+  scadFile << "import(\"trackpointapp_export.3mf\");\n";
+  for (SteamVRTrackPoint* point: points) {
+    osg::Vec3 translation = point->getTranslation();
+    osg::Vec3 rotation = point->getRotation();
+    scadFile << "steamVrTrackPointBase([" << translation.x() << "," << translation.y() << "," << translation.z() << "], [" << rotation.x() << "," << rotation.y() << "," << rotation.z() << "], " << point->getLength() << ");\n";
+  }
+  scadFile.close();
+  std::string command = openScadPath + " -o " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_steamvrtrack.3mf " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_steamvrtrack.scad";
+  system(command.c_str());
+}

+ 2 - 1
trackpoint-app/src/PointShape.cpp

@@ -3,6 +3,7 @@
 
 // Include modules
 #include "OSGWidget.hpp"
+#include "defaults.hpp"
 
 // Include dependencies
 #include <osgDB/ReadFile>
@@ -84,7 +85,7 @@ void PointShape::setupSteamVRTrack(SteamVRTrackSettings steamVrTrackSettings) {
     _optiTrackSteamVRLength = steamVrTrackSettings.length;
     _geode = new osg::Geode;
     _shape = new osg::ShapeDrawable();
-    _shape->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f, steamVrTrackSettings.length));
+    _shape->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), STEAMVR_CONSTANT_RADIUS, steamVrTrackSettings.length));
     _shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
     _geode->addDrawable(_shape.get());
     osg::ref_ptr<osg::Node> screw = osgDB::readNodeFile("../resources/steamvrthread.stl");

+ 28 - 1
trackpoint-app/src/ProjectStore.cpp

@@ -108,7 +108,34 @@ bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
 
   }
   if (settings.SteamVRTrack) {
-
+    renderer->renderSteamVRTrack(_steamVrTrackPoints);
+    Lib3MF::PModel steamVrTrackModel = _wrapper->CreateModel();
+    Lib3MF::PReader reader = steamVrTrackModel->QueryReader("3mf");
+    reader->ReadFromFile(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_steamvrtrack.3mf");
+    Lib3MF::PMeshObjectIterator meshIterator = steamVrTrackModel->GetMeshObjects();
+    if (meshIterator->Count() != 1) {
+      return false;
+    }
+    meshIterator->MoveNext();
+    Lib3MF::PMeshObject renderedMesh = meshIterator->GetCurrentMeshObject();
+    Lib3MF::PMeshObject exportMesh = exportModel->AddMeshObject();
+    std::vector<Lib3MF::sPosition> verticesBuffer;
+    std::vector<Lib3MF::sTriangle> triangleBuffer;
+    renderedMesh->GetVertices(verticesBuffer);
+    renderedMesh->GetTriangleIndices(triangleBuffer);
+    exportMesh->SetGeometry(verticesBuffer, triangleBuffer);
+    std::vector<std::vector<float>> pointsList;
+    for (SteamVRTrackPoint* point: _steamVrTrackPoints) {
+      std::vector<float> pointData;
+      osg::Vec3 trackPoint = point->getTrackPoint();
+      pointData.push_back(trackPoint.x());
+      pointData.push_back(trackPoint.y());
+      pointData.push_back(trackPoint.z());
+      pointsList.push_back(pointData);
+    }
+    json trackpointData = pointsList;
+    metaData->AddMetaData("tk-ar-tracking", "trackpoints-steamvrtrack", trackpointData.dump(), "string", true);
+    exportModel->AddBuildItem(exportMesh.get(), _wrapper->GetIdentityTransform());
   }
   delete renderer;
   Lib3MF::PWriter exportWriter = exportModel->QueryWriter("3mf");