Skocz do zawartości

Odwrotne kierunki myszki w 3D i kolizje


Morti

Rekomendowane odpowiedzi

Witam.

Od pewnego czasu zajmuję się 3D i mam problem. Robię strzelankę. mam ustawione w celownik podążanie za myszką. Tylko że jak biorę myszkę do góry to celownik idzie na dół i na odwrót (na boki jest normalnie). I jak zrobić wykrywanie kolizji (screen)

Robi mi się tak:

db7192aa28.png

 

PS: Jak zrobić idealną kule bo jak piszę to:

 

GML
d3d_draw_ellipsoid (x+0,y+0,0,x+50,y+50,-100,background_get_texture(texturka1),1,1,24);

draw_set_color(c_white)

To wychodzi mi jajko :/

Odnośnik do komentarza
Udostępnij na innych stronach

Ludzie przestańcie wreszcie rozpowszechniać tą złą metodę pisania kodu na rysowanie figur w 3D, wiem że to mniej tekstu i działa ale na dłuższą metę to beznadziejny sposób jak już to:

 

d3d_transform_add_translation(x,y,z)//Jak nie masz zmiennej "Z" to daj tam 0

d3d_draw_ellipsoid (-25,-25,25, 25,25,-25,background_get_texture(texturka1),1,1,24) //Tak wiem zmieniłem pivot point na środek

d3d_transform_set_identity()

draw_set_color(c_white)

Odnośnik do komentarza
Udostępnij na innych stronach

Czy 'draw_set_color(c_white)' nie powinno być na początku? ( A jeszcze lepiej - tylko w create kontrolera ) :)

Nie 'd3d_transform_add_translation', a 'd3d_transform_set_translation' ;)

 

Co do zmiennej Z, ustaw ją na 25 jeśli używasz tego kodu do rysowania:

GML
d3d_draw_ellipsoid (-25,-25,25, 25,25,-25,background_get_texture(texturka1),1,1,24)
Odnośnik do komentarza
Udostępnij na innych stronach

W tym przypadku jak jest tylko jeden transform to wystarczy użyć seta i bez końcowego identity.

 

Różnica pomiędzy set a add jest taka że set to połączenie 2 funkcji:

 

d3d_transform_set_identity() oraz d3d_transform_*

 

 

a add jest poprostu: d3d_transform_* bez identity na początku.

 

 

czyli:

GML
d3d_transform_set_identity()

d3d_transform_add_translation(x,y,z)//Jak nie masz zmiennej "Z" to daj tam 0

d3d_draw_ellipsoid (-25,-25,25, 25,25,-25,background_get_texture(texturka1),1,1,24) //Tak wiem zmieniłem pivot point na środek</span></span>

będzie tym samym co: ( tylko optymalniejsze bo oszczędzamy na 1 wywołaniu )

GML
d3d_transform_set_translation(x,y,z)//Jak nie masz zmiennej "Z" to daj tam 0

d3d_draw_ellipsoid (-25,-25,25, 25,25,-25,background_get_texture(texturka1),1,1,24) //Tak wiem zmieniłem pivot point na środek</span></span>

 

a z kolei:

GML
d3d_transform_set_translation(x,y,z)//Jak nie masz zmiennej "Z" to daj tam 0

d3d_draw_ellipsoid (-25,-25,25, 25,25,-25,background_get_texture(texturka1),1,1,24) //Tak wiem zmieniłem pivot point na środek

d3d_transform_set_identity()

będzie nieoptymalne bo set_identity wykona się podwójnie. raz na początku i raz na końcu.

Odnośnik do komentarza
Udostępnij na innych stronach

I jak wspomniałem add pozwoli na rotacje i skalowanie, bo trzba je wykonać pomiędzy d3d_transform_set_identity() a d3d_transform_add_translation(x,y,z) co jest niemożliwe w przypadku d3d_transform_set_translation(x,y,z) co sprawia że jest bardziej funkcjonalny ja jednak upierał bym się przy add

Odnośnik do komentarza
Udostępnij na innych stronach

No w sumie to w tym konkretnym przypadku faktycznie powinno być add i identity bo prawdopodobnie przetransformuje mu jeszcze projekcję chyba że przed drawem projekcji wklei identity. Tak czy siak warto mieć na uwadze czym set i add się różni bo wiedząc to można zoptymalizować grę.

 

edit: taki mały przykład prosto z mojej gry jak optymalnie stosować set i add kiedy musimy wyświetlić 2 modele naraz:

GML
d3d_transform_add_scaling(0.75, 0.75, 0.75);

d3d_transform_add_rotation_z(dirXY + 270);

d3d_transform_add_translation(x,y,z);

d3d_model_draw(global.model_tank[0],0,0,0,background_get_texture(bg_tex_tank_dol));

 

d3d_transform_set_scaling(0.75, 0.75, 0.75);

d3d_transform_add_rotation_z(dirXY + 90 );

d3d_transform_add_translation(x,y,z);

d3d_model_draw(global.model_tank[1],0,0,0,background_get_texture(bg_tex_tank_dol));

 

d3d_transform_set_identity();

Można tutaj zauważyć że d3d_transform_set_identity(); jest użyte tylko raz, mogłem tak zrobić bo seta dałem w scaling 2 modelu ( oszczędność na wywołaniu 1 funkcji )

Odnośnik do komentarza
Udostępnij na innych stronach

Tak ale jeszcze optymalniej było by ręcznie zskalować model w programie do 3D skoro już wiesz o ile chcesz go zskalować :P

 

GML
d3d_transform_add_rotation_z(dirXY + 270);

d3d_transform_add_translation(x,y,z);

d3d_model_draw(global.model_tank[0],0,0,0,background_get_texture(bg_tex_tank_dol));

 

d3d_transform_set_rotation_z(dirXY + 90 );

d3d_transform_add_translation(x,y,z);

d3d_model_draw(global.model_tank[1],0,0,0,background_get_texture(bg_tex_tank_dol));

 

d3d_transform_set_identity();

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki wszystkim za odpowiedz :)

A co z tymi odwrotnymi kierunkami ??

Właśnie się skapłem, że wszystko co postawie w roomie, w grze jest "odwrócone". Tzn. jak coś jest w roomie na dole to w grze jest na górze :/

Odnośnik do komentarza
Udostępnij na innych stronach

W kamerze która jest też hero mam w step:

GML
if keyboard_check(ord('W')) y+=6;

if keyboard_check(ord('S')) y-=6;

if keyboard_check(ord('A')) x-=6;

if keyboard_check(ord('D')) x+=6;

Pytałem się raczej o ustawienia d3d_set_projection()

 

w trybie 3d oś Y jest odwrócona. To znaczy, że wzrasta do góry, a nie do dołu (współrzędne 0,0 są w lewym dolnym rogu)

raczej bardziej zależy od ustawień d3d_set_projection() (Domyślnie możliwe, nie wiem bo zawszę korzystam kamery)

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