MeshTools.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Include own header
  2. #include "MeshTools.hpp"
  3. // Include modules
  4. #include "MainWindow.hpp"
  5. // Include dependencies
  6. #include <math.h>
  7. void MeshTools::calculateNormals(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer, osg::ref_ptr<osg::Vec3Array> vertices, osg::ref_ptr<osg::Vec3Array> normals) {
  8. for (const Lib3MF::sTriangle triangle: triangleBuffer) {
  9. // Create osg vectors
  10. osg::Vec3 vertex[3] = {};
  11. for (char i = 0; i < 3; i++) {
  12. vertex[i] = osg::Vec3(verticesBuffer[triangle.m_Indices[i]].m_Coordinates[0], verticesBuffer[triangle.m_Indices[i]].m_Coordinates[1], verticesBuffer[triangle.m_Indices[i]].m_Coordinates[2]);
  13. }
  14. // Calculate normal
  15. osg::Vec3 edgeOne = vertex[1].operator-(vertex[0]);
  16. osg::Vec3 edgeTwo = vertex[2].operator-(vertex[0]);
  17. osg::Vec3 normal = edgeOne.operator^(edgeTwo);
  18. normal.normalize();
  19. // Store them
  20. for (int i = 0; i < 3; i++) {
  21. vertices->push_back(vertex[i]);
  22. normals->push_back(normal);
  23. }
  24. }
  25. }
  26. float MeshTools::angleBetween(osg::Vec3 a, osg::Vec3 b) {
  27. float normA = a.length();
  28. float normB = b.length();
  29. float dotProduct = a.operator*(b);
  30. return acos(dotProduct / (normA * normB));
  31. }
  32. float MeshTools::compensationLength(osg::Vec3 a, osg::Vec3 b, float length) {
  33. osg::Matrix modifierRotation = osg::Matrix::rotate(b.x() * M_PI / 180, osg::Vec3(1.0f, 0.0f, 0.0f), b.y() * M_PI / 180, osg::Vec3(0.0f, 1.0f, 0.0f), b.z() * M_PI / 180, osg::Vec3(0.0f, 0.0f, 1.0f));
  34. osg::Vec3 newNormal = modifierRotation.preMult(a);
  35. newNormal.normalize();
  36. float angle = MeshTools::angleBetween(a, newNormal);
  37. return isnan(tan(angle) * length) ? 0.0f : tan(angle) * length;
  38. }
  39. bool MeshTools::optiTrackSanityCheck(const std::vector<OptiTrackPoint*> points, const bool showSuccessMessage) {
  40. // Check for three on a line
  41. bool foundLineProblem = false;
  42. if (points.size() >= 3) {
  43. for (int i = 0; i < (points.size() - 1); i++) {
  44. for (int j = i + 1; j < points.size(); j++) {
  45. for (int k = 0; k < points.size(); k++) {
  46. if (k != i && k != j) {
  47. osg::Vec3 a = points[i]->getTrackPoint();
  48. osg::Vec3 b = points[j]->getTrackPoint().operator-(a);
  49. osg::Vec3 point = points[k]->getTrackPoint();
  50. osg::Vec3 pMinusA = point.operator-(a);
  51. osg::Vec3 crossProduct = pMinusA.operator^(b);
  52. float distance = crossProduct.length() / b.length();
  53. if (distance < OPTITRACK_SANITY_DISTANCE_THRESHOLD) {
  54. foundLineProblem = true;
  55. }
  56. }
  57. }
  58. }
  59. }
  60. }
  61. // Check for four on a plane
  62. bool foundPlaneProblem = false;
  63. if (points.size() >= 4) {
  64. for (int i = 0; i < (points.size() - 2); i++) {
  65. for (int j = i + 1; j < (points.size() - 1); j++) {
  66. for (int k = j + 1; k < points.size(); k++) {
  67. for (int l = 0; l < points.size(); l++) {
  68. if (l != i && l != j && l != k) {
  69. osg::Vec3 a = points[i]->getTrackPoint();
  70. osg::Vec3 b = points[j]->getTrackPoint();
  71. osg::Vec3 c = points[k]->getTrackPoint();
  72. osg::Vec3 point = points[l]->getTrackPoint();
  73. osg::Plane* plane = new osg::Plane(a, b, c);
  74. float distance = std::abs(plane->distance(point));
  75. delete plane;
  76. if (distance < OPTITRACK_SANITY_DISTANCE_THRESHOLD) {
  77. foundPlaneProblem = true;
  78. }
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. if (foundLineProblem) {
  86. MainWindow::getInstance()->showOptiTrackSanityLineError();
  87. }
  88. if (foundPlaneProblem) {
  89. MainWindow::getInstance()->showOptiTrackSanityPlaneError();
  90. }
  91. if (!foundLineProblem && !foundPlaneProblem && showSuccessMessage) {
  92. MainWindow::getInstance()->showOptiTrackSanitySuccess();
  93. }
  94. return foundLineProblem || foundPlaneProblem;
  95. }