tBane Temat założony przez niniejszego użytkownika |
Automatyczne wyznaczanie liczby klatek z Sprite Sheetu » 2025-10-26 12:50:10 Cześć. Potrzebuję obliczyć ile klatek jest w Sprite Sheet'ie w pionie i w poziomie. Jak to zrobić? Mam pewien pomysł ale nie wiem czy zadziała. Tzn trzeba wyznaczyć odcinki pikseli różnych od tła. Potem mamy szerokość każdej klatki, ale jak to rozszerzyć o pionowe klatki?  No bo chciałbym zrobić tak, że w poziomie są klatki animacjia w pionie są kolejne animacje. Tak jak na poniższej grafice  Wynik programu powinien wynosić: animacja = 1 | klatki = 9 animacja = 2 | klatki = 8 animacja = 3 | klatki = 9 animacja = 4 | klatki = 9 animacja = 5 | klatki = 9 animacja = 6 | klatki = 6 No i jeszcze jest offset - to znaczy, że pierwsza klatka/animacja może być przesunięta względem początku tekstury i to też powinno się uwzględnić. No więc... jak sie za to zabrać ? |
|
pekfos |
» 2025-10-26 20:47:08 Nie zrobisz tego w 100% automatycznie. Potrzebujesz punkt bazowy klatki (piksel który ma się wyświetlić na ekranie w punkcie X, gdy cała animacja ma się wyświetlić w punkcie X). Gdy określisz punkt bazowy dla dwóch pierwszych klatek, możesz spróbować ekstrapolować pozostałe zakładając że będą na pozycjach określonych funkcją liniową. Na kompetentnie wykonanych grafikach to pewnie zadziała. To trzeba będzie wizualnie zweryfikować, bo błąd spowoduje że animacja będzie się źle zapętlać albo drżeć. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-10-26 20:49:49 A zakładając, że klatki i animacje znajdują się w takich samych odstępach a jedynie pierwsza klatka jest przesunieta o dany offset, to jak to obliczyć? W Unity jakoś to zrobili, że wyznacza klatki ze spriteshetu |
|
pekfos |
» 2025-10-26 21:00:05 Nie obliczysz tego. To nie jest kwestia geometrii, tylko interpretacji tego co jest na tej grafice. Jeżeli obliczysz "coś" automatycznie, to znaczenie tego będzie różne dla każdego tilesetu i będziesz musiał to kompensować dodatkowym parametrem ustalanym ręcznie. Prościej od razu zrobić to dobrze. Przykładowo: masz animację szczura i animację nietoperza, można je stosować zamiennie. Ale jeden chodzi po ziemi, a drugi lata, więc punkt bazowy szczura jest zaraz pod nim, a punkt bazowy nietoperza dużo niżej od samego sprajta. Jeżeli animacja będzie zawierać też cień postaci, to dla nietoperza będą to rozłączne kształty i automat może to zinterpretować jako osobne animacje. W Unity jakoś to zrobili, że wyznacza klatki ze spriteshetu Tak jak napisałem, "coś" możesz zawsze obliczyć automatycznie. Unity na pewno ma edytor by to poprawić ręcznie gdy automat zawiedzie. Ty pytasz tylko o automat. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-10-26 21:07:04 No dobra. To jak to "coś" obliczyć? Bo ja pomysłu nie mam jak zacząć nawet. Mam okienko w którym można zmieniać wartości ręcznie, ale chciałbym, by przy odpalaniu cokolwiek załadowało i gdy się nie powiedzie załadowanie animacji to znaczy krzywo załaduje to użytkownik ręcznie sobie to skoryguje. Jak się nie da tego zrobić to ustawie 64x64 domyślnie i tyle  |
|
pekfos |
» 2025-10-26 21:27:45 Ja bym zaczął od paru iteracji dylatacji obrazu by zamieść pod dywan przypadki luźnych pikseli, albo sprajtów które składają się z kilku różnych, rozłącznych kształtów. Wtedy masz obraz który składa się z szeregu "plam", możesz wtedy wyczerpująco przeszukać obraz piksel po piskelu by je zlokalizować i jak znajedziesz, to algorytmem floodfill określasz pozycję wszystkich piskeli tej plamy, usuwasz je z obrazu i zapamiętujesz minimum i maksimum X i Y (bounding box). Usuwasz żeby nie znaleźć tej samej plamy więcej niż raz. Masz bounding box dla każdej klatki (z małym marginesem, bo każda iteracja dylatacji doda 2px do szerokości i wysokości, możesz na tej postawie ten margines usunąć jak chcesz). To jest wystarczające by pokazać klatki jak w tym screenie z Unity, ale nie wystarczy by tą animację wyświetlić. Potrzebne są punkty bazowe dla klatek, a te lepiej zgadnąć niż wyciągnąć z tych bounding boxów. Powiedzmy że pierwszy punkt bazowy jest gdzieś w bounding boxie pierwszej klatki (ręcznie bym go postawił miedzy stopami, więc środek dolnej krawędzi bounding boxa??). To jest X=0, próbujesz dopasować wartości A i B, tak by dla kolejnych klatek X=1,2,3,... pozycje punktów bazowych AX+B były "ok". Wymyśl na to jakąś heurystykę. Może żeby punkt bazowy ostatniej klatki wyszedł tak samo jak dla pierwszej? Jeżeli animacja się zapętla, te dwie klatki są podobne. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-10-26 21:37:17 Czyli zrobić tak: -znaleźć piksel różny od tła pętlą for(y,x) -wyznaczyć piksele należące do tego kształtu i je usuwać z spritesheetu oraz zapisywać min/max x,y
-mamy zbiór klatek
jak je podzielić na animacje/klatki ?
|
|
pekfos |
» 2025-10-26 21:42:53 Zbiór klatek jest podzielony na klatki z definicji. Animacje tworzą rzędy. Jeśli posortujesz klatki po Y, będziesz mieć wyraźne przerwy.
Na wypadek jeśli nie zrozumiałeś, automat nie zadziała zawsze. Musisz mieć edytor do robienia tego ręcznie, więc może zacznij od tego, a potem pomyśl jak to zautomatyzować? Mógłbym w długim temacie opisywać jak wykonać kroki które opisałem, ale to ostatecznie jest tylko ułatwienie do procesu, którego nie masz. |
|
| « 1 » 2 |