Skocz do zawartości

współrzędne textur trójkątów


Rekomendowane odpowiedzi

Robię sobie edytor do map 3d wzorowany na tych, które oferują nam edycję plików .wad Doom, Doom II czy Hexen. Zrobiłem już rysowanie ścian, odwracanie ich normalnych [ screen 1 ] oraz rysowanie podłóg. O ile rysowanie ścian to proste zagadnienie gdyż ściany zawsze są prostokątem o tyle rysowanie podłogi to już hardcore bo kształt podłogi może przybierać dowolną formę, z dowolna ilością wierzchołków [ screen 2 ] ponad to musiałem zastosować konwersję rysowanego polygonu na trójkąty [ screen 3 ], które potem zostają zgrupowane jako sectory i wyświetlane w widoku 3D.

 

Wszystko przebiega sprawnie do momentu kiedy chcę nałożyć texturę na podłogę.

Nie potrafię sobie nawet wyobrazić jak mógł by wyglądać scrypt do układania współrzędnych textur tego kompleksu trójkątów w taki sposób aby gracz miał złudzenie że widzi pod sobą jedną teksturę [ screen 4 ] a nie dziesiątki trójkątów [ screen 5 ].

 

Kod na Wyświetlanie podłogi wygląda u mnie tak:

 

 

global.levelFloorCount to ilość podług

global.tex[0] to tekstura ceglanego murka

triangleCount to ilość trójkątów w sprawdzanej podłodze

 

triangleX1[i,j]

triangleY1[i,j]

triangleX2[i,j] to są współrzędne 3 wierzchołków składających się na 1 trójkąt współrzędne są generowane za pomocą tego skryptu polygon_to_triangles

triangleY2[i,j]

triangleX3[i,j]

triangleY3[i,j]

GML
for ( i = 0; i < global.levelFloorCount; i += 1 )

{

var w, h;

w = 0;

h = 0;

d3d_primitive_begin_texture(pr_trianglelist,global.tex[0]);

for ( j = 0; j < camera.triangleCount; j += 1 )

{

if ( w == _7 ) w = 1; else w = 0; if ( h == _9 ) h = 1; else h = 0; /* na to nie musicie patrzeć zrobiłem to dla debuga

[ w widoku 3d klawiszami numpadu 7,9,4,6,1,3 można zmieniać w real time współrzędne textur ]*/

d3d_vertex_texture(camera.triangleX1[i,j],camera.triangleY1[i,j],0,w,h);

if ( w == _4 ) w = 1; else w = 0; if ( h == _6 ) h = 1; else h = 0;

d3d_vertex_texture(camera.triangleX3[i,j],camera.triangleY3[i,j],0,w,h);

if ( w == _1 ) w = 1; else w = 0; if ( h == _3 ) h = 1; else h = 0;

d3d_vertex_texture(camera.triangleX2[i,j],camera.triangleY2[i,j],0,w,h);

 

};

d3d_primitive_end();

}

 

Dla lepszego zobrazowania wszystkiego daję jeszcze plik exe edytora: http://www.gmclan.org/up539_4_jakisFPS.html

po uruchomieniu wyświetla się od razu widok 3D, klawiszem F12 wchodzimy w 2d naciskamy 'M' zmieniając tryb z rysowania ścian na rysowanie podłogi i rysujemy kształt myszką ważna rzecz kształt musi być rysowany w kierunku przeciwnym do wskazówek zegara a linie nie mogą się przecinać, kształt musi być zapętlony wciskamy F12 i widzimy rezultaty

Odnośnik do komentarza
Udostępnij na innych stronach

górnylewy 0,0

górnyprawy 1,0

dolnylewy 0,1

dolnyprawy 1,1

 

trójkąt ma 3 wierzchołki już rozumiesz?

przyciskami 7 9 4 6 1 3 można je zmieniać da się wykonać nimi 64 kombinacje, sprawdziłem wszystkie i żadna nie układa textur prawidłowo.

Myślę że za tym musi stać jakiś większy algorytm.

Odnośnik do komentarza
Udostępnij na innych stronach

trójkąt ma 3 wierzchołki już rozumiesz?

Kurde sry pomyliłem się, mam zagrożenie z matmy :( .

 

Haha, koleżko, nie podałem ci współrzędnych do trójkąta, tylko do textury. Jak już rysujesz te swoje kwadracioki, to zrób jakąś funkcję, która dzieli go na 2 trójkąty i przypisuje odpowiednie współrzędne texturze, takie to niezrozumiałe ?

 

I nie chcę mi się testować twoich przycisków numerkowych, jeśli KOLEJNOŚĆ jest zła, to obrót textury nic nie da.

Odnośnik do komentarza
Udostępnij na innych stronach

I nie chcę mi się testować twoich przycisków numerkowych

nie musisz ja przetestowałem wszystkie możliwości i nie działa

 

funkcja która dzieli kwadraty na pół to jest już zrobiona tylko kłopot jest właśnie ze przypisaniem współrzędnych textur

Kwadrat może być podzielony na 2 sposoby, współrzędne w każdym z nich muszą być ustawiane inaczej:

kwadrat.png

Odnośnik do komentarza
Udostępnij na innych stronach

Mam nastepujace pytanko, czy nie mozna rysowac floora o wymiarach max_szerokosc_levelu * max_wysokosc_levelu?

Przeciez w czasie gry to, co za pomieszczeniem, jest niewidoczne.

Tyle ze ten edytor zapewne ma oferować coś więcej niż płaski level

------------------

Nie znam się na tym za bardzo, ale myślę że tak, wielkość i szerokość Podłogi,było by jako 100%w x i y

 

i teraz byś musiał wziąć danego trisa współrzędne obliczyć jaki to procent z tych 100%

 

dzięki temu powinieneś uzyskać mapowanie uv

 

w tym momencie miał byś jedną texturę dobrze rozłożoną na cały level, jakbyś chciał mieć bardziej zloopowaną, bierzesz i dzielisz wszystkie wspułżedne.

 

jak już wspomniałem nie znam się za dobrze na tym, raczej tak na logikę, rzucę screena by zobrazować

 

tst.png

 

tu akurat są quady ale i na tris powinno zadziałać

 

ten sposób akurat może rozciągać texture, ale zawsze powinien być dobrze rozłożony,

jakbyś chciał mieć dobrze rozłożoną textury musiał byś wziąć i porównać szerokość i wysokość,

najmniejszych i największych współrzędnych, po czym obliczyć różnice w procentach

 

i daną część podzielić przez uzyskaną różnice.

-------------------------------------------------------------------------

Mógłbyś też dodać osobno 2 poli jako wyznaczniki skali

tst2.png

 

 

 

Mam nadzieje że pomogłem a nie plete głupoty :P

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