animacja 3D w stylu opengl

0

W czym napisać szybko animację 3D, która będzie działać bezpośrednio w przeglądarce?
Może np. javaScript coś takiego ogarnia?

0

WebGL, czyli implementacja OpenGL w JavaScripcie.

0

Unity, eksport do WebGL. Można szybko zrobić animację. W nowej wersji dodali nawet timeline (narzędzia do przedstawiania historyjek).

0

sam WebGL jest dość niskopoziomowy, ale można użyć np. biblioteki Three.js, żeby to sobie uprościć.

0

Ten WebGL nie działa mi poprawnie - na wypasionym desktopowym PC!, więc to jakachś niedoróbka (kolejna reklamówka zapewne).

A gdyby nawet to działało, to przecież i tak nie nam bladego pojęcia jak w tym programować, bo to nie jest opengl, lecz jakiś porąbany kolon gl-podobny.

0

Nie musisz za dużo programować, użyj Unity - WebGL jest tam obsłużony za Ciebie, to co zobaczysz w edytorze Unity zobaczysz na stronie internetowej.

Czystego WebGL też można się nauczyć, tylko zamiast kursu OpenGL należy skorzystać z kursu WebGL ;)

0
walicja napisał(a):

Ten WebGL nie działa mi poprawnie - na wypasionym desktopowym PC!, więc to jakachś niedoróbka (kolejna reklamówka zapewne).

Np. widok 3D w mapach google jest na tym oparty i potrafi działać O na dość zabytkowych sprzętach. Może problem sterowników.
https://www.google.pl/maps/@52.2327804,21.0170685,146a,35y,263.2h,78.98t/data=!3m1!1e3

2
walicja napisał(a):

Ten WebGL nie działa mi poprawnie - na wypasionym desktopowym PC!, więc to jakachś niedoróbka (kolejna reklamówka zapewne).

Jaka grafika, jaka przeglądarka, jakie sterowniki.

walicja napisał(a):

W czym napisać szybko animację 3D, która będzie działać bezpośrednio w przeglądarce?
Może np. javaScript coś takiego ogarnia?

A gdyby nawet to działało, to przecież i tak nie nam bladego pojęcia jak w tym programować, bo to nie jest opengl, lecz jakiś porąbany kolon gl-podobny.

Najpierw pytasz o 3D pod javascriptem, dostajesz odpowiedź pozytywną, i od razu narzekasz że to nie jest OpenGL tylko „porąbany kolon”. Może zajmij się czymś innym w takim razie.

0

Najpierw pytasz o 3D pod javascriptem, dostajesz odpowiedź pozytywną, i od razu narzekasz że to nie jest OpenGL tylko „porąbany kolon”. Może zajmij się czymś innym w takim razie.

Problem w tym że mogę znaleźć przykładowej strony - html z tym WebGL.
Np. wchodzę tu: WebGL samples:
http://webglsamples.org/

no i tu niestety nie ma śladu kodu, a jedynie obrazki.

0

Poza tym nie znam się na tych shaderach, które są tam chyba konieczne.

Chodzi mi o proste rysowanie brył, np. rura, dętka, kula, śruba, itp.;
i z prostym oświetleniem, włączanym zwyczajnym glLamp.

0

A nie chodzi Ci przypadkiem o takie funkcje jak glLoadIdentity, glMultMatrix, glTranslate, glRotate, glVertex itp? W takim razie nie zaznasz ich w WebGLu, ponieważ przynajmniej od dekady są one przestarzałe i niezalecane, a WebGL jest znacznie nowszy. Teraz używa się, jak słusznie zauważyłeś, shaderów, tablic wierzchołków które wysyła się bezpośrednio do GPU i tak dalej, a nie rzeźbi każdy pojedynczy wierzchołek za pomocą glVertex.

https://stackoverflow.com/questions/3327267/where-are-all-the-simple-functions-gone-in-webgl

0
walicja napisał(a):

Poza tym nie znam się na tych shaderach, które są tam chyba konieczne.

Użyj three.js - tam są już przygotowane typowe. Prosty przykład:
https://threejs.org/examples/#webgl_geometry_cube

0
EntityPamerano napisał(a):

A nie chodzi Ci przypadkiem o takie funkcje jak glLoadIdentity, glMultMatrix, glTranslate, glRotate, glVertex itp? W takim razie nie zaznasz ich w WebGLu, ponieważ przynajmniej od dekady są one przestarzałe i niezalecane, a WebGL jest znacznie nowszy. Teraz używa się, jak słusznie zauważyłeś, shaderów, tablic wierzchołków które wysyła się bezpośrednio do GPU i tak dalej, a nie rzeźbi każdy pojedynczy wierzchołek za pomocą glVertex.

https://stackoverflow.com/questions/3327267/where-are-all-the-simple-functions-gone-in-webgl

Ah, tak!
No to narysuj mi np. obracany swobodnie, i oświetlany purpurowym światłem, torus w tym nowoczesnym minigl.

0
zz napisał(a):
walicja napisał(a):

Poza tym nie znam się na tych shaderach, które są tam chyba konieczne.

Użyj three.js - tam są już przygotowane typowe. Prosty przykład:
https://threejs.org/examples/#webgl_geometry_cube

Narysuj mi złotą kotwicę, która się obraca np. dookoła osi: 1,2,3, no i błyszczy jak należy, bo jest oświetlana... światłem - takim słońcowym. :)

0

Nie zdajesz sobie sprawy jak wolne jest glVertex w porównaniu do współczesnych metod renderowania :D - EntityPamerano dziś, 18:54

Zdaję sobie bardzo dobrze sprawę.
Np. przy 100 wierzchołkach na bryle mam około 32 fps;
natomiast po podzieleniu tego do 10000 wierzchołków mam.. 32 fps.

I jest tak przy zwyczajnym timerze, ustawionym na 30 ms... karta graficzna pracuje na 10%, bo nawet nie zwiększa częstotliwości (pracuje w trybie idle - na 10% mocy, czyli z 3W).

0

32 klatki to akurat na pewno nie wina OpenGLa, nawet używając glVertexów. Stawiam że to problem z timerem, zawsze jak pisałem grę to miałem jakąś pętlę główną która co iterację generowała klatkę, nie używałem do tego żadnych timerów. Chyba że piszesz w jakimś QT, tam nie wiem jak to rozwiązać inaczej, nie zajmowałem się tym głębiej.

0
EntityPamerano napisał(a):

A nie chodzi Ci przypadkiem o takie funkcje jak glLoadIdentity, glMultMatrix, glTranslate, glRotate, glVertex itp? W takim razie nie zaznasz ich w WebGLu, ponieważ przynajmniej od dekady są one przestarzałe i niezalecane, a WebGL jest znacznie nowszy. Teraz używa się, jak słusznie zauważyłeś, shaderów, tablic wierzchołków które wysyła się bezpośrednio do GPU i tak dalej, a nie rzeźbi każdy pojedynczy wierzchołek za pomocą glVertex.

Poruszyłeś kilka spraw które ludzie zwykle wrzucają właśnie do jednego wora, a które w OpenGL pojawiły się wcale niejednocześnie.

Tablice wierzchołków weszły do standardu OpenGL 1.1, czyli są prawie od początku. Nie trzeba więc „rzeźbić każdego wierzchołka”.
Wysyłanie bezpośrednio do GPU (vertex buffer objects) to OpenGL 1.5.
Shadery (GLSL) weszły w wersji 2.0.
Wbudowane transformacje macierzowe stały się “deprecated” w wersji 3.0.

Najbardziej niezrozumiała jest dla mnie ta zmiana ostatnia (glTranslate, glRotate), bo nic nie dodała tylko usunęła i to nie dając żadnej alternatywy. Na dodatek usuwa rzecz potrzebną, przez co każdy musi sobie znaleźć bibliotekę zastępczą albo oprogramować matematykę samemu (albo olać core profile i zrobić to w stylu 2.x). To nie była mądra zmiana.

Nie ma jednego „starego” i jednego „nowego” OpenGL-a. OpenGL to jest taki ruchomy cel. Nigdy nie wiesz czy twoja ulubiona funkcja nie okaże się “deprecated” w następnej wersji. Zresztą tej następnej, najnowszej wersji i tak nie będzie można użyć, bo zanim będzie wystarczająco szeroko wspierana przez karty graficzne i sterowniki to miną lata, a w międzyczasie wyjdzie kolejna wersja. Powodzenia życzę komuś kto dziś wyda gierkę czy program wymagający najnowszej wersji 4.6 gdzie są sterowniki tylko Nvidii i to beta.

0
EntityPamerano napisał(a):

32 klatki to akurat na pewno nie wina OpenGLa, nawet używając glVertexów. Stawiam że to problem z timerem, zawsze jak pisałem grę to miałem jakąś pętlę główną która co iterację generowała klatkę, nie używałem do tego żadnych timerów. Chyba że piszesz w jakimś QT, tam nie wiem jak to rozwiązać inaczej, nie zajmowałem się tym głębiej.

Przy ustawieniu timera na 30ms (takim z Windows api) masz 1000/30 = 33.333 komunikatów na sekundę,
co daje tyle samo fps podczas rysowania, ale przy zerowym czasie obliczeń!

Ty chcesz rysować to non-stop - tak w pętli, co dałoby powyżej 1000 fps;
ale niestety maksimum to 60 fps zazwyczaj, bo monitor nie nadąży (ani też oko tego nie zarejestruje - filmy są robione zwykle z 24 fps zaledwie!).

0

Odnośnie tych: glVertex, glNormal, itp., no to ja nie potrzebuję tego.

Nawet łatwiej byłoby to robić seriami, czyli za pomocą gotowych tablic, które tworzą od razu 100 czy 1000 trójkątów!
Ale to nie powinno być robione w prostszy sposób - nie tak jak to sobie wymyślono w gl 1.1!

Wystarczyło tak coś w tym stylu:
glVertex(p, 1000);
glNormal(n, 1000);
itd.

wrzucamy od razu 1000 wierzchołków (w jakimś tam trybie: quads, triangles, itd., który może być nadal ustawiany tradycyjnie: glBegin(mod),
bo to jest i tak tylko jedno wywołanie...

No i po co komu te pierdoły z gl..array, glPointer.. ble sre?
Zapewne komuś się coś tu grupo po... mieszało w główce.

0
walicja napisał(a):

ale niestety maksimum to 60 fps zazwyczaj, bo monitor nie nadąży (ani też oko tego nie zarejestruje

Nie wiem jak to wygląda w WebGL, ale w desktopowym OpenGL nie robi się tego na timerze. Rozwiązaniem jest vsync, czyli synchronizacja z odświeżaniem monitora. Do tego służy funkcja wglSwapIntervalEXT.

Ale to nie powinno być robione w prostszy sposób - nie tak jak to sobie wymyślono w gl 1.1!

No ale tak nie jest, jest trudniej. Gdy używamy VBO (vertex buffer objects) robi się jeszcze trudniej, a gdy używamy VAO (vertex array objects) jeszcze trudniej. Od wersji bodajże 3.3 (Core Profile) użycie VAO staje się obowiązkowe. To jest właśnie ten „ruchomy cel”: coś znika, coś się pojawia, coś się pojawia a potem znika, coś się staje wymagane itp.

0
Azarien napisał(a):
walicja napisał(a):

ale niestety maksimum to 60 fps zazwyczaj, bo monitor nie nadąży (ani też oko tego nie zarejestruje

Nie wiem jak to wygląda w WebGL, ale w desktopowym OpenGL nie robi się tego na timerze. Rozwiązaniem jest vsync, czyli synchronizacja z odświeżaniem monitora. Do tego służy funkcja wglSwapIntervalEXT.

Mam zamiar robić proste animacje - symulacje fizyki w 3D, a nie żadne gry,
więc nawet i 10 fps mi w zupełności wystarczy.

No ale tak nie jest, jest trudniej. Gdy używamy VBO (vertex buffer objects) robi się jeszcze trudniej, a gdy używamy VAO (vertex array objects) jeszcze trudniej. Od wersji bodajże 3.3 (Core Profile) użycie VAO staje się obowiązkowe. To jest właśnie ten „ruchomy cel”: coś znika, coś się pojawia, coś się pojawia a potem znika, coś się staje wymagane itp.

Jakoś nie przypominam sobie żeby np. w c++ coś znikało w kolejnych wersjach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1