Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

Witam. Mam drobny problem z teksturą szyby w grze. Chodzi o to, że jest ona przezroczysta, jednak przez nią nie widać innych obiektów typu ściany, bonusy. Jak można tą śrubkę dokręcić?

 

Oto screen z problemem przezroczystości. Za tymi blokami szkła, powinny być widoczne nieprzezroczyste ściany takie, jak po bokach.

 

screen.png

 

I żeby nie otwierać niepotrzebnie kolejnego tematu, mam drugie pytanie. Jak naprawić problem z niełączeniem się tekstur szyby? Chodzi mi po prostu o to, żeby łączenia między szybami nie były widoczne, co też widać na tym screenie.

Opublikowano

1. Przeważnie problem polega na kolejności rysowanych elementów, przezroczyste elementy rysuje się jako ostatnie (w gm mniejsza wartość depth). Jeżeli włączysz alpha test i dasz wartość referencyjną np. 40%, elementy będą nakładane na przezroczyste, co straci efekt jakby obiekt stał za szkłem.

2. Wystarczy nie rysować niepotrzebnych ścian, np. sprawdzając, czy po bokach nie stoi już jakaś ściana.

Opublikowano

I am Lord - już używam alpha testu do tego, żeby szyba miała "kanał alpha" ;)

 

Konrad-GM - pomogło, gdy zmieniłem głębie szkła z 0 na -1, jednak nadal mam problem z łączeniami. Możesz wytłumaczyć, jak to dokładnie zrobić, bo nie czaję, a to nie wygląda za ciekawie z takimi łączeniami

Opublikowano

Możesz użyć tego bardzo prostego rozwiązania https://forum.gmclan.org/index.php?showtopi...st&p=411717

przygotuj sobie 16 konfiguracji swoich modeli ścian szyby i zapisz je w tablicy w tej kolejności jak pokazałem na obrazku.

 

Oczywiście zamiast image index będziesz zmieniał index tablicy w której te modele masz zapisane.

Opublikowano

Niestety zmiana głębi z 0 na -1 nie działała do końca tak, jak bym tego chciał, bo gdy popatrzyłem jakby od drugiej strony tego szkła, to nie było widać przez nie innych bloków szkła. Teraz to poprawiłem, ale dzięki za nakierowanie, że chodzi o depth ;). Naprawiłem to tak:

 

DRAW EVENT w bloku szkła

GML
distance = point_distance(x,y,o_player.x,o_player.y);

depth = (1000 - distance) * (-1)

 

Jednak jeśli chodzi o ten drugi problem. Nie ma jakiegoś prostszego sposobu? Trzeba koniecznie robić tyle modeli? Jeśli tak, to po prostu wykorzystam "d3d_draw__wall()" bo jeśli chodzi o modelowanie bardziej skomplikowanych modeli, to niestety Sketchup już mi nie pomoże, bo nie mam tam już eksportu do OBJ, czy jakiegoś w ten deseń, który obsługuje GM:S. Nie da się usuwać ścian figur, które na przykład są "w sobie", serio?

Opublikowano

Chcę podrzucić prostą anegdotkę. Ten sam problem wciąż występuje w Minecrafcie. Jeżeli ustawicie wodę która jest przezroczysta za szybą która jest także przezroczysta to silnik tego nie obsłuży i nie będzie rysować dalszego obiektu.

To nie jest prosty problem a jest na prawdę wielowarstwowy.

 

Z tego co się orientuję jest to rozwiązane właśnie przez depth, ale nie w taki sposób jak to się wydaje. Po prostu najpierw rysowane są wszystkie nieprzezroczyste obiekty, a potem rysowane są te przezroczyste. I to udało Ci się rozwiązać. Przypadkiem.

 

Rozwiązanie łączenia się szyb wymaga tu jednak czegoś skomplikowanego. Jedno rozwiązanie które mi przychodzi do głowy to: dla bloku szkła sprawdzanie z których stron jest obserwowany (raycast 3D) i rysowanie tylko tych ścian.

Opublikowano

Ale nie potrzebny ci żaden program do rysowania modeli. Możesz stworzyć własny model uzywając GML, to będzie bardzo proste. Najbardziej skomplikowany model w tym rozwiązaniu to tylko 4 wywołania funkcji d3d_draw_wall.

Opublikowano

A zapytam jeszcze z innej beczki, acz w sumie też pasuje do tematu. Czy da się zmienić teksturę na przykład tylko jednej ściany sześcianu rysowanego przez "d3d_draw_block", czy do tego też trzeba dorysować ścianę (d3d_draw_wall) po którymś z pożądanych boków? Tak pytam z ciekawości, ale w sumie i tak mi to będzie najprawdopodobniej potrzebne za jakiś czas.

Opublikowano

Nie pamiętam dokładnie jak to było. Musiałbyś przenieść d3d_draw_block() by był wewnątrz nowo tworzonego modelu i wtedy chyba model może dostać teksturę. Przyjdzie I am Lord i mnie poprawi.

 

A nie możesz narysować d3d_draw_wall() na d3d_draw_block() bo dojdzie do clipingu. Obie będą siebie zasłaniać.

Opublikowano
A nie możesz narysować d3d_draw_wall() na d3d_draw_block() bo dojdzie do clipingu. Obie będą siebie zasłaniać.

Wystarczy narysować o 1 jednostkę odległości z przodu. W taki sposób robi się decale, czyli wszystkie efekty zniszczeń krwi itd w grach.

 

d3d_draw_block() nie zrobisz różnych textur ścian bo tam UV mapa jest skopana. Trzeba zrobić własny model sześcianu tymi http://docs.yoyogames.com/source/dadiospic...dels/index.html funkcjami lub narysować sobie w Blenderze z poprawnym UV.

Jak nie zapomnę to ci taki model zrobię w weekend.

Opublikowano

No dobra zrobiłem 2 wersje takich bloczków. Jeden jest bez sufitu i podłogi, ma 4 ściany a drugi normalny sześcian.

 

Użyłem pr_trianglelist zamiast optymalniejszego pr_trianglestrip ponieważ to drugie byłoby ci o wiele trudniej zrozumieć. Wobec tego w modelu nakładają się na siebie wierzchołki, wizualnie to zupełnie nic nie zmienia.

Oczywiście w przypadku z 6 scianami textury będą mniejszej rozdzielczości bo zajmują więcej miejsca na obrazku. Chyba że zwiększysz obrazek. Jak zmienisz wielkość obrazka to musisz zmienić 'len'

 

cCfvzJn.png

eJQFr5Y.png

YNaDbhq.png

4 ścienny:

tworzenie modelu. Zmienna 's' odpowiada za wielkość bloczku, a tekturę ustaw swój sprite według szablonu

GML
s = 64;

textura = sprite_get_texture(sCubeTex4, 0);

 

cube4 = d3d_model_create();

d3d_model_primitive_begin(cube4, pr_trianglelist);

 

/* Widok z gory, numery scian, kropka to origin

 

xxxx 1 xxxx /\ -y

x x ||

4 . 2 || UpVector = ( 0, 0, 1 )

x x || czyli os Z to wysokosc i jest dodatnia

xxxx 3 xxxx []========> x

*/

len = 256/512; // dlugosc textury na spritcie wyrazona w wartosci od 0 do 1

// sciana 1

// trojkat 1

d3d_model_vertex_normal_texture(cube4, s, -s, -s, 0, -1, 0, 0, len);

d3d_model_vertex_normal_texture(cube4, s, -s, s, 0, -1, 0, 0, 0);

d3d_model_vertex_normal_texture(cube4, -s, -s, s, 0, -1, 0, len, 0);

// trojkat 2

d3d_model_vertex_normal_texture(cube4, s, -s, -s, 0, -1, 0, 0, len);

d3d_model_vertex_normal_texture(cube4, -s, -s, s, 0, -1, 0, len, 0);

d3d_model_vertex_normal_texture(cube4, -s, -s, -s, 0, -1, 0, len, len);

 

 

// sciana 2

// trojkat 1

d3d_model_vertex_normal_texture(cube4, s, s, -s, 1, 0, 0, len, len);

d3d_model_vertex_normal_texture(cube4, s, s, s, 1, 0, 0, len, 0);

d3d_model_vertex_normal_texture(cube4, s, -s, s, 1, 0, 0, len+len, 0);

// trojkat 2

d3d_model_vertex_normal_texture(cube4, s, s, -s, 1, 0, 0, len, len);

d3d_model_vertex_normal_texture(cube4, s, -s, s, 1, 0, 0, len+len, 0);

d3d_model_vertex_normal_texture(cube4, s, -s, -s, 1, 0, 0, len+len, len);

 

// sciana 3

// trojkat 1

d3d_model_vertex_normal_texture(cube4, -s, s, -s, 0, 1, 0, 0, len+len);

d3d_model_vertex_normal_texture(cube4, -s, s, s, 0, 1, 0, 0, len);

d3d_model_vertex_normal_texture(cube4, s, s, s, 0, 1, 0, len, len);

// trojkat 2

d3d_model_vertex_normal_texture(cube4, -s, s, -s, 0, 1, 0, 0, len+len);

d3d_model_vertex_normal_texture(cube4, s, s, s, 0, 1, 0, len, len);

d3d_model_vertex_normal_texture(cube4, s, s, -s, 0, 1, 0, len, len+len);

 

// sciana 4

// trojkat 1

d3d_model_vertex_normal_texture(cube4, -s, -s, -s, -1, 0, 0, len, len+len);

d3d_model_vertex_normal_texture(cube4, -s, -s, s, -1, 0, 0, len, len);

d3d_model_vertex_normal_texture(cube4, -s, s, s, -1, 0, 0, len+len, len);

// trojkat 2

d3d_model_vertex_normal_texture(cube4, -s, -s, -s, -1, 0, 0, len, len+len);

d3d_model_vertex_normal_texture(cube4, -s, s, s, -1, 0, 0, len+len, len);

d3d_model_vertex_normal_texture(cube4, -s, s, -s, -1, 0, 0, len+len, len+len);

 

d3d_model_primitive_end(cube4);

 

Sześcian:

GML
/// model create

s = 64;

textura = sprite_get_texture(sCubeTex6, 0);

 

cube6 = d3d_model_create();

d3d_model_primitive_begin(cube6, pr_trianglelist);

 

len = 170/512; // dlugosc textury na spritcie wyrazona w wartosci od 0 do 1

// sciana 1

// trojkat 1

d3d_model_vertex_normal_texture(cube6, s, -s, -s, 0, -1, 0, 0, len);

d3d_model_vertex_normal_texture(cube6, s, -s, s, 0, -1, 0, 0, 0);

d3d_model_vertex_normal_texture(cube6, -s, -s, s, 0, -1, 0, len, 0);

// trojkat 2

d3d_model_vertex_normal_texture(cube6, s, -s, -s, 0, -1, 0, 0, len);

d3d_model_vertex_normal_texture(cube6, -s, -s, s, 0, -1, 0, len, 0);

d3d_model_vertex_normal_texture(cube6, -s, -s, -s, 0, -1, 0, len, len);

 

 

// sciana 2

d3d_model_vertex_normal_texture(cube6, s, s, -s, 1, 0, 0, len, len);

d3d_model_vertex_normal_texture(cube6, s, s, s, 1, 0, 0, len, 0);

d3d_model_vertex_normal_texture(cube6, s, -s, s, 1, 0, 0, len+len, 0);

 

d3d_model_vertex_normal_texture(cube6, s, s, -s, 1, 0, 0, len, len);

d3d_model_vertex_normal_texture(cube6, s, -s, s, 1, 0, 0, len+len, 0);

d3d_model_vertex_normal_texture(cube6, s, -s, -s, 1, 0, 0, len+len, len);

 

// sciana 3

d3d_model_vertex_normal_texture(cube6, -s, s, -s, 0, 1, 0, 0, len+len);

d3d_model_vertex_normal_texture(cube6, -s, s, s, 0, 1, 0, 0, len);

d3d_model_vertex_normal_texture(cube6, s, s, s, 0, 1, 0, len, len);

 

d3d_model_vertex_normal_texture(cube6, -s, s, -s, 0, 1, 0, 0, len+len);

d3d_model_vertex_normal_texture(cube6, s, s, s, 0, 1, 0, len, len);

d3d_model_vertex_normal_texture(cube6, s, s, -s, 0, 1, 0, len, len+len);

 

// sciana 4

d3d_model_vertex_normal_texture(cube6, -s, -s, -s, -1, 0, 0, len, len+len);

d3d_model_vertex_normal_texture(cube6, -s, -s, s, -1, 0, 0, len, len);

d3d_model_vertex_normal_texture(cube6, -s, s, s, -1, 0, 0, len+len, len);

 

d3d_model_vertex_normal_texture(cube6, -s, -s, -s, -1, 0, 0, len, len+len);

d3d_model_vertex_normal_texture(cube6, -s, s, s, -1, 0, 0, len+len, len);

d3d_model_vertex_normal_texture(cube6, -s, s, -s, -1, 0, 0, len+len, len+len);

 

// góra

d3d_model_vertex_normal_texture(cube6, -s, s, s, 0, 0, 1, len*2, len);

d3d_model_vertex_normal_texture(cube6, -s, -s, s, 0, 0, 1, len*2, 0);

d3d_model_vertex_normal_texture(cube6, s, -s, s, 0, 0, 1, len*3, 0);

 

d3d_model_vertex_normal_texture(cube6, -s, s, s, 0, 0, 1, len*2, len);

d3d_model_vertex_normal_texture(cube6, s, -s, s, 0, 0, 1, len*3, 0);

d3d_model_vertex_normal_texture(cube6, s, s, s, 0, 0, 1, len*3, len);

 

// dol

d3d_model_vertex_normal_texture(cube6, -s, -s, -s, 0, 0, -1, len*2, len*2);

d3d_model_vertex_normal_texture(cube6, -s, s, -s, 0, 0, -1, len*2, len);

d3d_model_vertex_normal_texture(cube6, +s, s, -s, 0, 0, -1, len*3, len);

 

d3d_model_vertex_normal_texture(cube6, -s, -s, -s, 0, 0, -1, len*2, len*2);

d3d_model_vertex_normal_texture(cube6, s, s, -s, 0, 0, -1, len*3, len);

d3d_model_vertex_normal_texture(cube6, s, -s, -s, 0, 0, -1, len*3, len*2);

 

d3d_model_primitive_end(cube6);

 

 

wyświetlanie:

GML
d3d_model_draw(cube4, x, y, z, textura);

d3d_model_draw(cube6, x, y, z, textura);

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...