Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czytanie plików STL w PHP
Forum PHP.pl > Forum > PHP
deha21
Potrzebuję pomocy przy czytaniu plików .STL (modele do druku 3D). Używam skryptu podpatrzonego na jednej ze stron. Umożliwia on określenie rozmiarów modelu. Generalnie skrypt działa i w większości przypadków się sprawdza, ale... Gdy model w pliku nie jest wycentrowany tylko przeniesiony od punkt 0,0,0 to jego skrypt wczytuje jego rozmiar właśnie od 0,0,0 do maksymalnych wartości. Przykład: Mamy boxa 3x3x3, przeniesionego o 2 punkty na każdej osi. Skrypt nie wskaże rozmiaru modelu jako 3x3x3 ale 5x5x5. Mam nadzieję, że wiecie o co chodzi. Poniżej funkcja:
  1. function stl($file) {
  2.  
  3. $x_max = 0;
  4. $y_max = 0;
  5. $z_max = 0;
  6. $x_min = 0;
  7. $y_min = 0;
  8. $z_min = 0;
  9. $filepath = $file;
  10. $fp = fopen($filepath, "rb");
  11. fseek($fp, 80);
  12. $data = fread($fp, 4);
  13. $numOfFacets = unpack("I", $data);
  14.  
  15. for ($i = 0; $i < $numOfFacets[1]; $i++){
  16.  
  17. //Start Normal Vector
  18. $data = fread($fp, 4);
  19. $hold = unpack("f", $data);
  20. $normalVectorsX[$i] = $hold[1];
  21. $data = fread($fp, 4);
  22. $hold = unpack("f", $data);
  23. $normalVectorsY[$i] = $hold[1];
  24. $data = fread($fp, 4);
  25. $hold = unpack("f", $data);
  26. $normalVectorsZ[$i] = $hold[1];
  27. //End Normal Vector
  28. //Start Vertex1
  29. $data = fread($fp, 4);
  30. $hold = unpack("f", $data);
  31. $vertex1X[$i] = $hold[1];
  32. $data = fread($fp, 4);
  33. $hold = unpack("f", $data);
  34. $vertex1Y[$i] = $hold[1];
  35. $data = fread($fp, 4);
  36. $hold = unpack("f", $data);
  37. $vertex1Z[$i] = $hold[1];
  38. //End Vertex1
  39. //Start Vertex2
  40. $data = fread($fp, 4);
  41. $hold = unpack("f", $data);
  42. $vertex2X[$i] = $hold[1];
  43. $data = fread($fp, 4);
  44. $hold = unpack("f", $data);
  45. $vertex2Y[$i] = $hold[1];
  46. $data = fread($fp, 4);
  47. $hold = unpack("f", $data);
  48. $vertex2Z[$i] = $hold[1];
  49. //End Vertex2
  50. //Start Vertex3
  51. $data = fread($fp, 4);
  52. $hold = unpack("f", $data);
  53. $vertex3X[$i] = $hold[1];
  54. $data = fread($fp, 4);
  55. $hold = unpack("f", $data);
  56. $vertex3Y[$i] = $hold[1];
  57. $data = fread($fp, 4);
  58. $hold = unpack("f", $data);
  59. $vertex3Z[$i] = $hold[1];
  60. //End Vertex3
  61. //Attribute Byte Count
  62. $data = fread($fp, 2);
  63. // $hold = unpack("S", $data);
  64. // $abc[$i] = $hold[1];
  65.  
  66. $x_vals = array($vertex1X[$i], $vertex2X[$i], $vertex3X[$i]);
  67. $y_vals = array($vertex1Y[$i], $vertex2Y[$i], $vertex3Y[$i]);
  68. $z_vals = array($vertex1Z[$i], $vertex2Z[$i], $vertex3Z[$i]);
  69.  
  70. if (max($x_vals) > $x_max) {
  71. $x_max = max($x_vals);
  72. }
  73. if (max($y_vals) > $y_max) {
  74. $y_max = max($y_vals);
  75. }
  76. if (max($z_vals) > $z_max) {
  77. $z_max = max($z_vals);
  78. }
  79. if (min($x_vals) < $x_min) {
  80. $x_min = min($x_vals);
  81. }
  82. if (min($y_vals) < $y_min) {
  83. $y_min = min($y_vals);
  84. }
  85. if (min($z_vals) < $z_min) {
  86. $z_min = min($z_vals);
  87. }
  88.  
  89. }
  90.  
  91. echo 'X: ',$x_dim,'<br>';
  92. echo 'Y: ',$y_dim,'<br>';
  93. echo 'Z: ',$z_dim,'<br>';
  94.  
  95. }
trueblue
$x_min, $y_min, $z_min powinny być zainicjowane dużą, dodatnią wartością.
Skoro obiekt jest przesunięty od (2,2,2), to minimum z X, Y, Z stanowią odpowiednio: (0.5, 0.5, 0.5), więc przy porównywaniu z 0 (min($x_vals) < $x_min), $x_min, $y_min oraz $z_min, zawsze będą mieć wartość 0.
deha21
Wielkie dzięki smile.gif
trueblue
I przy okazji zmienne $x_max, $y_max, $z_max powinny mieć duże wartości ujemne.
Jeśli obiekt będzie przesunięty w przeciwnym kierunku, to będziesz mieć identyczny problem (X, Y, Z miałyby odpowiednio: -0.5, -0.5, -0.5).
deha21
Problem jest taki że nigdy nie wiem w którą stronę jest przesunięty obiekt. Jak to rozwiązać?
trueblue
Nie bardzo rozumiem.

$x_min i pochodne ustawiasz na duże dodatnie,
$x_max i pochodne ustawiasz na duże ujemne.
deha21
$x_max ma być sporo ujemne, a $x_min sporo dodatnie. Myślałem że jak będzie obiekty przesunięte w -2,-2,-2 to też będzie problem. Będzie ok?
EDIT: Chyba jest okej, bo przeniosłem obiekt w inne miejsce i dalej wymiary są prawidłowe.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.