Skocz do zawartości

Obługa myszy w 3D


Markuz

Rekomendowane odpowiedzi

Nie wiedziałem jak zrobić mysz w 3D, więc sam ją narysowałem pobierając mouse_x i mouse_y , wszystko ok, myszka jest widoczna, działa sprawnie, lecz jak zrobić że np. gdy klikne na dany obiekt ( narysowany w 3D ) to żeby wykonała się jakaś akcja? Zwykły event mouse click nie działa, mouse enter i leave też nie . Proszę o pomoc .

Odnośnik do komentarza
Udostępnij na innych stronach

Eventy z Mouse nie dzialaja, poniewaz operuja na maskach, a one nie moga sie nagle splaszczyc, rozciagac, obracac itd. w trybie 3D.

Sa dwie mozliwosci: albo ustawic mask na /same as sprite/ i pokombinowac z obliczeniami do transformowania na 3D, albo zrobic prosty bounding box do rysowanego obiektu i sprawdzac pozycje mouse_x i mouse_y.

Ew. skorzystaj z jakiegos silnika, np. Ultimate 3D.

 

Zeby zrobic przezroczystosc obiektow 3D, uzyj image_alpha draw_set_alpha (dzieki YXE, cos mi sie pomieszalo, myslalem akurat o image'ach z racji transformacji mask :D)

Odnośnik do komentarza
Udostępnij na innych stronach

Zeby zrobic przezroczystosc obiektow 3D, uzyj image_alpha

nie, od tego służy draw_set_alpha(0.5)

Odnośnik do komentarza
Udostępnij na innych stronach

Skrypt wykrywający kolizję w lini prostej z boxem ( BoundingBox Ray Tracing )

By Tepi.

GML
///////////////////////////////////////////////////////////////////////////

// Description: This script returns true if the line intersects the block.

//

// arguments: (x1, y1, z1, x2, y2, z2, x0, y0, z0, dx, dy, dz)

// The line is given in form (x0 + dxt, y0 + dyt, z0 + dzt), t is any real.

//////////////////////////////// ~ Tepi //////////////////////////////////

{

var a, b, c, xx, yy, zz, Dx, Dy, Dz, d;

 

a = abs(argument3 - argument0)/2;

b = abs(argument4 - argument1)/2;

c = abs(argument5 - argument2)/2;

xx = (argument3 + argument0)/2 - argument6;

yy = (argument4 + argument1)/2 - argument7;

zz = (argument5 + argument2)/2 - argument8;

Dx = argument9; if (Dx == 0) Dx = .000001;

Dy = argument10; if (Dy == 0) Dy = .000001;

Dz = argument11; if (Dz == 0) Dz = .000001;

 

d = sqrt(Dx*Dx + Dy*Dy + Dz*Dz); //The direction vector's magnitude

Dx /= d; Dy /= d; Dz /= d; //Normalizing the direction vector

d = 10000;

if abs(yy - Dy * (xx + a) / Dx) <= b

&& abs(zz - Dz * (xx + a) / Dx) <= c

d = min(d,(xx + a) / Dx);

if abs(yy - Dy * (xx - a) / Dx) <= b

&& abs(zz - Dz * (xx - a) / Dx) <= c

d = min(d,(xx - a) / Dx);

if abs(xx - Dx * (yy + b) / Dy) <= a

&& abs(zz - Dz * (yy + b) / Dy) <= c

d = min(d,(yy + b) / Dy);

if abs(xx - Dx * (yy - b) / Dy) <= a

&& abs(zz - Dz * (yy - b) / Dy) <= c

d = min(d,(yy - b) / Dy);

if abs(xx - Dx * (zz + c) / Dz) <= a

&& abs(yy - Dy * (zz + c) / Dz) <= b

d = min(d,(zz + c) / Dz);

if abs(xx - Dx * (zz - c) / Dz) <= a

&& abs(yy - Dy * (zz - c) / Dz) <= b

d = min(d,(zz - c) / Dz);

 

if (d < 0) return 0; //This line makes it a ray.

global.XX = argument6 + Dx * d;

global.YY = argument7 + Dy * d;

global.ZZ = argument8 + Dz * d;

global.ddx = 0; global.ddy = 0; global.ddz = 0;

if abs(Dx * d - xx)/a == 1 global.ddx = sign(Dx * d - xx);

if abs(Dy * d - yy)/b == 1 global.ddy = sign(Dy * d - yy);

if abs(Dz * d - zz)/c == 1 global.ddz = sign(Dz * d - zz);

return (d != 10000);

}

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