Renderowanie plików STL w OpenGL - jak naprawić dziury

Rozmowy na luzie np. o pogodzie lub śmiesznych kotach
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 8
Posty: 6383
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dragonn »

Temat trochę nietypowy ale może akurat ktoś będzie mi w stanie pomóc :D.
Siedzę nad programem pisanym w Pythonie z GUI w PyQT. Jednym z elementów jest widget który przedstawia ruch obiektu zgodnie z obrotem akcelerometru. No i obiekt ten jest plikiem STL, nawet udało mi się załadować go już i wyrenderować :D, ale jest tylko drobny problem:
2018-06-06-191354_3840x1080_scrot.png
:lol: :lol:, jak widać sam kształt jest w pełni okej. Ogólnie to dla uproszczenia obsługuje sobie tylko plik tekstowe STL.

Kod: Zaznacz cały

  
facet normal 0 0 -1
    outer loop
      vertex -4.96713 -4.49641 -2.1
      vertex -5.12966 -4.31006 -2.1
      vertex -5.08656 -4.25868 -2.1
endloop
Niezbyt rozumiem czym są te wartości przy facet, wydaje mi się że sam problem jest w tym że biorę punkty trójkąta jak leci przez co niektóry ściany są odwrócone i wychodzi taka sieczka?
Dobrze myślę?
Jeśli tak to jak rozpoznać to jaka kolejność punktów należy brać.
Sam mój kod renderujący wygląda tak:

Kod: Zaznacz cały

 
for facet in self.stl.facets:
 for f in range(1, 3):
   vertex=facet[f]
   gl.glVertex3d(vertex['x']*0.5, vertex['y']*0.5, vertex['z']*0.5)
Gdzie facet jest tablicą zawierającą dane facet które jest tablicą zawierający te trzy punkty danego facet.
Z góry dzięki za pomoc :D .
Awatar użytkownika
dziobu
Zasłużony
Postów w temacie: 8
Posty: 8908
Rejestracja: 28 gru 2016, 16:38
Drukarka: ZMorph 2.0(S)
x 5842
Kontakt:

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dziobu »

dragonn pisze:Niezbyt rozumiem czym są te wartości przy facet, wydaje mi się że sam problem jest w tym że biorę punkty trójkąta jak leci przez co niektóry ściany są odwrócone i wychodzi taka sieczka?
Imho dobrze Ci się wydaje.

Te 3 wartości to wektor normalnej.
https://en.wikipedia.org/wiki/STL_(file_format)
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 8
Posty: 6383
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dragonn »

Hmmmm okej, to zrobiłem takie coś:

Kod: Zaznacz cały

         for facet in self.stl.facets:
            gl.glNormal3f(facet['normal']['x'], facet['normal']['y'], facet['normal']['z'])
            for f in range(1, 3):
                vertex=facet[f]
                gl.glVertex3d(vertex['x']*0.5, vertex['y']*0.5, vertex['z']*0.5)
I hmmm, coś to pomogło ale nie z tym czym miałem problem:
2018-06-06-195837_3840x1080_scrot.png
Naprawiło mi się światło które próbowałem dodać wcześniej :rotfl2: . Chwila, sprawdzę czy może przy ładowaniu nie pomija mi jakiś ścian, ale trochę wątpię.

EDIT
Liczba ścian się zgadza, hmmm to nie wiem co jeszcze może być źle.
Awatar użytkownika
dziobu
Zasłużony
Postów w temacie: 8
Posty: 8908
Rejestracja: 28 gru 2016, 16:38
Drukarka: ZMorph 2.0(S)
x 5842
Kontakt:

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dziobu »

Nie wiem co to masz za model, ale z tego screena to wystaje tylko jakaś masakra. Nie masz problemu znaku dziesiętnego? Plik dobrze czytasz?
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 8
Posty: 6383
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dragonn »

To co widzisz co wystaje to nie wystaje nic, akurat taka perspektywę złapało.
Z innej perspektywy:
2018-06-06-200808_3840x1080_scrot.png
Wrzuciłem też plik STL w załączniku
acl.stl.zip
(339.08 KiB) Pobrany 135 razy
A tak wygląda kawałek z obiektu już po załadowaniu pliku STL:

Kod: Zaznacz cały

{'normal': {'x': 0.351805, 'y': 0.936073, 'z': 0.000401691}, 1: {'x': 0.3646163537933138, 'y': 0.9311956690580432, 'z': 0.27263849176442156}, 2: {'x': 0.3411796178783677, 'y': 0.940035324101508, 'z': 0.19877573798031278}, 3: {'x': 2.37214, 'y': 6.53584, 'z': 1.38204}}]
A, zapomniałem dodać że żeby się ładnie kadrował model w oknie to normalizuje wartości jego od -1 do 1. Czy to może powodować problem z renderowaniem?
Awatar użytkownika
dziobu
Zasłużony
Postów w temacie: 8
Posty: 8908
Rejestracja: 28 gru 2016, 16:38
Drukarka: ZMorph 2.0(S)
x 5842
Kontakt:

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dziobu »

Może. Pamiętaj że biblioteka liczy na floatach/double (różnie) a te liczby nie mają nieskończonej dokładności.
Normalizuj do jakiejś dużej liczby, np 10^6 czy 10^10.
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 8
Posty: 6383
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dragonn »

Hmmm nie jestem pewny, normalizację robiłem po to bo nie wiem jak w OpenGL coś przeskalować/pracować na innych koordynatach niż -1 do 1 :D.
Ale dla testów wyłączyłem normalizację i niestety problem zostaje:
2018-06-06-223624_3840x1080_scrot.png
Oczywiście model się wtedy nie mieści w oknie ale jak widać problem zostaje.
Awatar użytkownika
dziobu
Zasłużony
Postów w temacie: 8
Posty: 8908
Rejestracja: 28 gru 2016, 16:38
Drukarka: ZMorph 2.0(S)
x 5842
Kontakt:

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dziobu »

A wygeneruj sobie sześcian i go załaduj.
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 8
Posty: 6383
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dragonn »

hahaha lol to był dobry pomysł :D, range(1,3) nie idzie 1 2 3 tylko 1 2, czeski błąd xD. Czyli tak naprawdę ładowałem tylko po 2 punkty z każdej ściany, brawo ja!
Ale został jeszcze jeden problem:
2018-06-06-231257_3840x1080_scrot.png
2018-06-06-231257_3840x1080_scrot.png (11.09 KiB) Przejrzano 3502 razy
2018-06-06-231311_3840x1080_scrot.png
Testowane na kostce z otworem i tym modelu którego wcześniej ładowałem. Czy to jest już może być problem z samym światłem?
Awatar użytkownika
dziobu
Zasłużony
Postów w temacie: 8
Posty: 8908
Rejestracja: 28 gru 2016, 16:38
Drukarka: ZMorph 2.0(S)
x 5842
Kontakt:

Re: Renderowanie plików STL w OpenGL - jak naprawić dziury

Post autor: dziobu »

Niby może choć to raczej by był błąd z lat '90 ;p
Albo źle definiujesz normalną i masz odwrotnie ściany (spróbuj odwrócić wektor normalnej) albo masz kamerę za blisko. Obstawiam to pierwsze.
ODPOWIEDZ

Wróć do „O wszystkim i o niczym”