[U3d]Rilevare il mouse

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Rispondi
Avatar utente
enick
GMI VIP
Messaggi: 3749
Iscritto il: 26/06/2011, 19:34
Specialità: 39dll e 3D
Località: Sardegna
Contatta:

[U3d]Rilevare il mouse

Messaggio da enick »

Per rilevare la direzione del player nel mio tds con d3d ero costretto a trovarmi le "coordinate 3d" con questi script,che utilizzavo in questo modo:


CAM
Spoiler

Codice: Seleziona tutto

d3d_set_projection_ext( xfrom, yfrom, zfrom, xto, yto, zto, xup, yup, zup, angle, aspect, znear, zfar)
scr_d3dmouse_init( xfrom, yfrom, zfrom, xto, yto, zto, xup, yup, zup, angle, aspect, znear, zfar)
PLAYER init
Spoiler

Codice: Seleziona tutto

scr_d3dmouse_init( 0,0,0, 1,1,1, 0,-1,0, 60,640/480,1,32000)


//idem
dir_to_mouse = 0
_mouse_x = 0
_mouse_y = 0
PLAYER STEP
Spoiler

Codice: Seleziona tutto

scr_d3dmouse_vect(2*(mouse_x/view_wview[0])-1,1-2*(mouse_y/view_hview[0]));
if global.zz<0.001
 {
  _mouse_x = global.d3dmouse_xfrom-global.xx*global.d3dmouse_zfrom/global.zz;
  _mouse_y = global.d3dmouse_yfrom-global.yy*global.d3dmouse_zfrom/global.zz;
 }


{

dir_to_mouse = point_direction(x,y,_mouse_x,_mouse_y)

}

d3dmouse_init(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,angle,aspect)
Spoiler

Codice: Seleziona tutto


var d;

global.d3dmouse_xfrom = argument0;
global.d3dmouse_yfrom = argument1;
global.d3dmouse_zfrom = argument2;

global.d3dmouse_xto = argument3-global.d3dmouse_xfrom;
global.d3dmouse_yto = argument4-global.d3dmouse_yfrom;
global.d3dmouse_zto = argument5-global.d3dmouse_zfrom;
d = sqrt(global.d3dmouse_xto*global.d3dmouse_xto+global.d3dmouse_yto*global.d3dmouse_yto+global.d3dmouse_zto*global.d3dmouse_zto);
global.d3dmouse_xto /= d;
global.d3dmouse_yto /= d;
global.d3dmouse_zto /= d;

global.d3dmouse_xup = argument6;
global.d3dmouse_yup = argument7;
global.d3dmouse_zup = argument8;
d = global.d3dmouse_xup*global.d3dmouse_xto+global.d3dmouse_yup*global.d3dmouse_yto+global.d3dmouse_zup*global.d3dmouse_zto;
global.d3dmouse_xup -= d*global.d3dmouse_xto;
global.d3dmouse_yup -= d*global.d3dmouse_yto;
global.d3dmouse_zup -= d*global.d3dmouse_zto;
d = tan(degtorad(argument9)/2)/sqrt(global.d3dmouse_xup*global.d3dmouse_xup+global.d3dmouse_yup*global.d3dmouse_yup+global.d3dmouse_zup*global.d3dmouse_zup);
global.d3dmouse_xup *= d;
global.d3dmouse_yup *= d;
global.d3dmouse_zup *= d;

global.d3dmouse_xcross = (global.d3dmouse_yup*global.d3dmouse_zto-global.d3dmouse_zup*global.d3dmouse_yto)*argument10;
global.d3dmouse_ycross = (global.d3dmouse_zup*global.d3dmouse_xto-global.d3dmouse_xup*global.d3dmouse_zto)*argument10;
global.d3dmouse_zcross = (global.d3dmouse_xup*global.d3dmouse_yto-global.d3dmouse_yup*global.d3dmouse_xto)*argument10;
d3dmouse_vect(x,y)
Spoiler

Codice: Seleziona tutto

// 
// let op, x en y gaan van -1 tot 1, en de y-as wijst naar boven!
global.xx = global.d3dmouse_xto+argument0*global.d3dmouse_xcross+argument1*global.d3dmouse_xup;
global.yy = global.d3dmouse_yto+argument0*global.d3dmouse_ycross+argument1*global.d3dmouse_yup;
global.zz = global.d3dmouse_zto+argument0*global.d3dmouse_zcross+argument1*global.d3dmouse_zup;
IN U3D c è una maniera che puo semplificarmi il tutto oppure come posso adattare questi script a U3D,non essendoci una funzione di proiezione?
Nicola porcu(Sardegna)
ImmagineImmagine
Immagine
Are you sleeping?
[email protected]

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da Jak »

Se è un topdown ed il personaggio è al centro non vedo quale possa essere il problema :roll:
Ancora non ho capito bene cosa vuoi fare :fapensare:
Comunque una soluzione che mi viene in mente è quella di trasformare coordinata mouse in un vettore di direzione(cè una funzione apposta) e testare questo su un piano con il ray tracing(un'altra funzione apposta). U3D a quel punto ti restituisce le esatte coordinate 3d del punto indicato dal mouse sul piano.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
enick
GMI VIP
Messaggi: 3749
Iscritto il: 26/06/2011, 19:34
Specialità: 39dll e 3D
Località: Sardegna
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da enick »

Jak ha scritto:Se è un topdown ed il personaggio è al centro non vedo quale possa essere il problema :roll:
Ancora non ho capito bene cosa vuoi fare :fapensare:
Comunque una soluzione che mi viene in mente è quella di trasformare coordinata mouse in un vettore di direzione(cè una funzione apposta) e testare questo su un piano con il ray tracing(un'altra funzione apposta). U3D a quel punto ti restituisce le esatte coordinate 3d del punto indicato dal mouse sul piano.
esatto, gli script li sopra fanno piu ho meno quello che hai detto, solo che non saprei come fare con u3d :roll: , su jak dammi una maniiiinaaa :twisted:
Nicola porcu(Sardegna)
ImmagineImmagine
Immagine
Are you sleeping?
[email protected]

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da fra3point »

Allora.. Tempo fa ho fatto uno script che selezionava un oggetto cliccato dal mouse.

Più o meno è questo il codice che devi usare per creare il sistema "clicca-e-vai" (non conosco il d3d e quelle funzioni che hai messo tu, quindi faccio il ragionamento da capo):

Codice: Seleziona tutto

mousePos = ScreenCoordToVector(-1,mouse_x,mouse_y,camera);
ray=CheckRayIntersection(<terreno>,camera.x,camera.y,camera.z+camera.height,CalculateVectorLongitude(mousePos),CalculateVectorLatitude(mousePos),<room_index>);
move_to_x= GetVector(mousePos,1);  //ritorna la parte x del vettore
move_to_y= GetVector(mousePos,2);  //ritorna la parte y del vettore
ReleaseVector(mousePos);
Poi ti calcoli la distanza tra l'oggetto e il punto (move_to_x,move_to_y) e se tale distanza è maggiore di 0 sposti l'oggetto in quella direzione.

Tutto questo non l'ho testato ma in linea di massima dovrebbe essere così. Se dovessi avere problemi dimmelo così lo provo! Ora non ho tempo! ;)
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
enick
GMI VIP
Messaggi: 3749
Iscritto il: 26/06/2011, 19:34
Specialità: 39dll e 3D
Località: Sardegna
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da enick »

a me servono solo 2 coordinate da usare in point_direction() per trovarmi la direzione del mouse dunque
move_to_x= GetVector(mousePos,1); //ritorna la parte x del vettore
move_to_y= GetVector(mousePos,2); //ritorna la parte y del vettore
dovrebbero corrispondere alle coordinate x e y del vettore?
Nicola porcu(Sardegna)
ImmagineImmagine
Immagine
Are you sleeping?
[email protected]

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da fra3point »

Esatto ritornano rispettivamente le componenti x ed y del vettore, quindi è come lavorare su un piano.
Provo anche io un secondo a farlo e vediamo cosa esce...

EDIT:
guarda ho trovato questo esempio che è molto completo e ben fatto, provalo!
http://filebeam.com/13713df73aad4bde839aeddbb83bea82
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
enick
GMI VIP
Messaggi: 3749
Iscritto il: 26/06/2011, 19:34
Specialità: 39dll e 3D
Località: Sardegna
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da enick »

fra3point ha scritto:Esatto ritornano rispettivamente le componenti x ed y del vettore, quindi è come lavorare su un piano.
Provo anche io un secondo a farlo e vediamo cosa esce...

EDIT:
guarda ho trovato questo esempio che è molto completo e ben fatto, provalo!
http://filebeam.com/13713df73aad4bde839aeddbb83bea82
Ho provato comunque e mi da errore a te funziona?
Nicola porcu(Sardegna)
ImmagineImmagine
Immagine
Are you sleeping?
[email protected]

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da fra3point »

che errore ti da?

EDIT:

Prova così:

Codice: Seleziona tutto

CamToCursor=ScreenCoordToVector(-1,mouse_x,mouse_y,0);

NormalizeVector(CamToCursor);
Longi=CalculateVectorLongitude(CamToCursor);
Lati=CalculateVectorLatitude(CamToCursor);
Dist=CheckRayIntersection(floor_obj,x,y,z,Longi,Lati,0);

if (Dist > 90000)
  ReleaseVector(CamToCursor);

//Destinazione
CalculateVectorScalarProduct(CamToCursor,CamToCursor,Dist);
X=x+GetVector(CamToCursor,1);
Y=y+GetVector(CamToCursor,2);
Z=z+GetVector(CamToCursor,3);  //eventualmente trovi anche la z, ma non serve

ReleaseVector(CamToCursor);
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
enick
GMI VIP
Messaggi: 3749
Iscritto il: 26/06/2011, 19:34
Specialità: 39dll e 3D
Località: Sardegna
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da enick »

fra3point ha scritto:che errore ti da?

EDIT:

Prova così:

Codice: Seleziona tutto

CamToCursor=ScreenCoordToVector(-1,mouse_x,mouse_y,0);

NormalizeVector(CamToCursor);
Longi=CalculateVectorLongitude(CamToCursor);
Lati=CalculateVectorLatitude(CamToCursor);
Dist=CheckRayIntersection(floor_obj,x,y,z,Longi,Lati,0);

if (Dist > 90000)
  ReleaseVector(CamToCursor);

//Destinazione
CalculateVectorScalarProduct(CamToCursor,CamToCursor,Dist);
X=x+GetVector(CamToCursor,1);
Y=y+GetVector(CamToCursor,2);
Z=z+GetVector(CamToCursor,3);  //eventualmente trovi anche la z, ma non serve

ReleaseVector(CamToCursor);

Codice: Seleziona tutto

You have attempted to read fromwith id 1, which does nt exists.Please make sure,that you haven't released it already and that the parameters for the math functions are corret.
Nicola porcu(Sardegna)
ImmagineImmagine
Immagine
Are you sleeping?
[email protected]

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da fra3point »

mmm.. Togli il release vector e mettilo nel destroy event!
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
enick
GMI VIP
Messaggi: 3749
Iscritto il: 26/06/2011, 19:34
Specialità: 39dll e 3D
Località: Sardegna
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da enick »

fra3point ha scritto:mmm.. Togli il release vector e mettilo nel destroy event!
In questo modo sembra funzionare,anche se in modo un po impreciso :furiosomedio: , come posso visualizzare il cursore ?
Nicola porcu(Sardegna)
ImmagineImmagine
Immagine
Are you sleeping?
[email protected]

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da fra3point »

Facile! Disegni un'immagine in (mouse_x,mouse_y).
In uno step event metti:

Codice: Seleziona tutto

DrawTex(<texture>,mouse_x,mouse_y,1,0,255);  //L'immagine da disegnare sarà il cursore (ad. es. una freccetta) 
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
enick
GMI VIP
Messaggi: 3749
Iscritto il: 26/06/2011, 19:34
Specialità: 39dll e 3D
Località: Sardegna
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da enick »

fra3point ha scritto:Facile! Disegni un'immagine in (mouse_x,mouse_y).
In uno step event metti:

Codice: Seleziona tutto

DrawTex(<texture>,mouse_x,mouse_y,1,0,255);  //L'immagine da disegnare sarà il cursore (ad. es. una freccetta) 
EDIT: sorry ho fatto un po di confusione tra i due diversi codici comunque con il secondo codice "il piu funzionante" viene invertito il rilevamento della y, mentre la x viene rilevata correttamente.. se sei riuscito a farlo funzionare credo che la soluzione piu semplice a questo punto sia quella di postare l esmpio :fapensare:


PS: non riesco a far visualizzare correttamente i modelli importati da sketchup, sono completamente neri anche disattivando il ligthing :? , voi di solito che proicedura usate per importare i modelli in u3d?
Nicola porcu(Sardegna)
ImmagineImmagine
Immagine
Are you sleeping?
[email protected]

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3d]Rilevare il mouse

Messaggio da fra3point »

Scusa ho avuto poco tempo per provare l'esempio.. Comunque io di solito esporto in .3ds, apro il modello in Model Viewer e lo salvo in .u3d.
In caso di textures già applicate uso u3d studio. Li trovi entrambi qui: http://ultimate3d.org/
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 16 ospiti