Strona 1 z 2

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

: 06 cze 2018, 19:21
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 .

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

: 06 cze 2018, 19:44
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)

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

: 06 cze 2018, 19:59
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.

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

: 06 cze 2018, 20:04
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?

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

: 06 cze 2018, 20:11
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?

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

: 06 cze 2018, 20:13
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.

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

: 06 cze 2018, 22:37
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.

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

: 06 cze 2018, 22:48
autor: dziobu
A wygeneruj sobie sześcian i go załaduj.

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

: 06 cze 2018, 23:14
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 3559 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?

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

: 06 cze 2018, 23:25
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.