Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

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

Opublikowano

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

Opublikowano

hhhmm.... kwateriony, brzmi niezbyt dobrze :P

 

No ale może znajdzie się jakaś prowizorka ? :D

Mam obroty kamery, jeszcze coś typu wektora dla kamery "3Dlenghtdir"

 

Może da się to jakoś wykorzystać ?

Opublikowano

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

Opublikowano
@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)

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