Strona 1 z 1
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
.
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ć
, ale jest tylko drobny problem:
, 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
.
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:
Naprawiło mi się światło które próbowałem dodać wcześniej
. 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:
Wrzuciłem też plik STL w załączniku
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
.
Ale dla testów wyłączyłem normalizację i niestety problem zostaje:
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ł
, 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 (11.09 KiB) Przejrzano 3612 razy
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.
Re: Renderowanie plików STL w OpenGL - jak naprawić dziury
: 06 cze 2018, 23:31
autor: dragonn
Kod: Zaznacz cały
gl.glNormal3f(-facet['normal']['x'], -facet['normal']['y'], -facet['normal']['z'])
Masz na myśli tak?
Niestety coś nie do końca:
Coś się zmienia ale to dalej nie to.
Wrzucę Ci jeszcze kod który włączam światło:
Kod: Zaznacz cały
gl.glEnable(gl.GL_CULL_FACE)
gl.glEnable(gl.GL_LIGHTING)
gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, [0.0, 0.0, 0.0, 1.0])
gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, [0.7, 0.7, 0.7, 1.0])
gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, [0.7, 0.7, 0.7, 1.0])
gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, [1.0, 1.0, 1.0, 0.0])
gl.glEnable(gl.GL_LIGHT0)
gl.glLightModelfv(gl.GL_LIGHT_MODEL_AMBIENT, [0.3, 0.3, 0.3, 1.0])
gl.glLightModeli(gl.GL_LIGHT_MODEL_LOCAL_VIEWER, gl.GL_TRUE)
gl.glEnable(gl.GL_CULL_FACE)
Re: Renderowanie plików STL w OpenGL - jak naprawić dziury
: 06 cze 2018, 23:39
autor: dziobu
To jeszcze pytanie czy GL_DEPTH_TEST Ci nie potrzebne.
Re: Renderowanie plików STL w OpenGL - jak naprawić dziury
: 06 cze 2018, 23:56
autor: dragonn
Mam wyżej tylko nie wkleiłem bo to już miałem wcześniej zanim dodawałem światło.
Re: Renderowanie plików STL w OpenGL - jak naprawić dziury
: 07 cze 2018, 00:05
autor: dziobu
- Spróbuj wywalić GL_CULL_FACE (masz w 2 miejscach).
- Usuń ustawianie normalnej.
Jak któreś z powyższych nie pomoże, to luknij tutaj:
https://learnopengl.com/Advanced-OpenGL/Face-culling
Re: Renderowanie plików STL w OpenGL - jak naprawić dziury
: 07 cze 2018, 00:08
autor: dragonn
Hmmmm właśnie! Akurat zanim napisałeś to dodałem gl.glFrontFace(gl.GL_CW) i wydaje się działać dobrze ale zobaczę jeszcze jaki efekt ma GL_CULL_FACE.
Ogromne dzięki za pomoc
! Na tym forum to z każdą rzeczą można liczyć na pomoc
.
Re: Renderowanie plików STL w OpenGL - jak naprawić dziury
: 07 cze 2018, 00:12
autor: dziobu
Ciesze się że mogłem pomóc
Pod podanym adresem masz opis o co z GL_CULL_FACE chodzi. Nawet fajnie napisane.