Skocz do zawartości

Obracanie obiektu według prędkości


Rekomendowane odpowiedzi

Witam,

Aby podbić kosmos brakuje mi tylko zrobienie komety, czyli particle narysowane na ściance.

Póki co mam obrót wokół osi X i Z, czyli zachowuje się jak "Billboard", ścianka jest skierowana w stronę kamery.

 

GML
zdir=point_direction(x,y,pl_layout.x,pl_layout.y)

xdir=-point_direction(0,z,point_distance(x,y,pl_layout.x,pl_layout.y),pl_layout.z)

 

d3d_transform_set_rotation_x(xdir)

d3d_transform_add_rotation_z(zdir-90)

d3d_transform_add_translation(x,y,z)

d3d_draw_wall(-20,0,-20,20,0,20,tex,1,1)

d3d_transform_set_identity()

 

Jednak ta kometa ma swoją prędkość, i trzeba obrócić ściankę o oś Y aby wyglądało na to, że naprawdę leci :P

 

tak mniej więcej wygląda "tex":

TEX

 

Jak uda się sam obrót, to potem się przyda ustawienie prędkości samego particla, gdy np. kometa leci prosto w stronę kamery

 

Ktoś potrafi mi w tym pomóc ?

Wydaje mi się, że to nie jest zbyt prosta sprawa....

Odnośnik do komentarza
Udostępnij na innych stronach

Bawiąc się w obracanie w 3 osiach masz do pokonania bardzo, bardzo trudną do rozwiązania kwestię "

".

Niestety aby swobodnie obiekty obracać w 3 osiach potrzebujesz do tego kwaternionów, które pracują w 4 osiach X, Y ,Z ,W a to nie jest w GM wbudowane. To jest wyższa matematyka by takie skrypty napisać. Widziałem parę na yoyogames implementacji tego ale z żadnej nie potrafiłem skorzystać tak czy siak :P

Odnośnik do komentarza
Udostępnij na innych stronach

No i odnalazłem ładną prowizorkę ! :D

 

Kometa nie porusza się tylko w stronę ekranu lub odwrotnie, efekt jest niezły :P

To pewnie też da się jakoś to zrobić

 

Zdjęcie

 

Może komuś to się przyda, więc zamieszczę kod

 

Zmienne, które się przydają do kamery (pl_layout):

GML
x_view=window_get_x()

y_view=window_get_y()

width_view=window_get_width()

height_view=window_get_height()

xcenter_view=(width_view/2)

ycenter_view=(height_view/2)

xcord_view=display_mouse_get_x()-x_view

ycord_view=display_mouse_get_y()-y_view

 

if mouse_check_button_pressed(mb_right)

display_mouse_set(xcenter_view+x_view,ycenter_view+y_view)

else if mouse_check_button(mb_right)

{

y_mov_prev=y_mov

 

x_mov+=xcord_view-xcenter_view

y_mov+=ycord_view-ycenter_view

}

 

Wektor dla kamery:

GML
x_ldir=sin(degtorad(-x_mov))*sin(degtorad(y_mov))*70

y_ldir=cos(degtorad(-x_mov))*sin(degtorad(y_mov))*70

z_ldir=cos(degtorad(y_mov))*70

 

CREATE dla komety:

GML
ydir=random(360)

spd=2

 

degree=point_direction(0,0,pl_layout.x_ldir,pl_layout.y_ldir)

 

xspd=sin(degtorad(degree))*lengthdir_x(spd,ydir)

yspd=cos(degtorad(degree))*lengthdir_x(spd,ydir)

zspd=lengthdir_y(spd,ydir)

 

zdir=point_direction(x,y,pl_layout.x,pl_layout.y)

 

No i dosyć zwykły DRAW:

GML
d3d_set_lighting(false)

 

d3d_transform_set_rotation_x(0)

d3d_transform_add_rotation_y(45+ydir)

d3d_transform_add_rotation_z(zdir-90)

d3d_transform_add_translation(x,y,z)

d3d_draw_wall(-20,0,-20,20,0,20,tex,1,1)

d3d_transform_set_identity()

 

d3d_set_lighting(true)

 

@HuderLord

Dzięki za pomoc :)

Odnośnik do komentarza
Udostępnij na innych stronach

@HuderLord

Dzięki za pomoc

Wat

 

Zamiast wywoływać funkcje degtorad i radtodeg to możesz sobie zrobić 2 stałe i poprostu kąty przez nie mnożyć.

 

d2r 0.017453292519943

r2d 57.2957795130823208

 

tak jest szybciej czyli dla przykładu:

GML
xspd=sin(d2r*degree)*lengthdir_x(spd,ydir)

yspd=cos(d2r*degree)*lengthdir_x(spd,ydir)

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