Skocz do zawartości

Problem z przezroczystą teksturą obiektu 3D


MetalowyNerd

Rekomendowane odpowiedzi

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.

Odnośnik do komentarza
Udostępnij na innych stronach

Chyba włączenie tego pomoże: http://docs.yoyogames.com/source/dadiospic...alpha_test.html

 

Co do drugiego:

Problem jest taki że ty stawiasz po prostu klocki, sześciany. Musiałbyś zrobić to samymi funkcjami od stawiania ścian d3d_draw_wall.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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?

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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ć.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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);

Odnośnik do komentarza
Udostępnij na innych stronach

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ę...