[U3D] Attaccare oggetti ad altri

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

[U3D] Attaccare oggetti ad altri

Messaggio da fra3point »

E' da un po' che sto seguendo la tecnica di "attaccare oggetti ad altri", e il codice che ho usato è più o meno quello del tutorial di filo.
Posto qui il problema anche se credo che in 2D sia lo stesso..

Io ho scritto due script, uno per trovare la variabile "point" e uno per la variabile "angle", qui posto solo quelli relativi ad un solo tipo di oggetto, ma ne ho fatti di simili per ogni oggetto da applicare.

Codice: Seleziona tutto

//SCRIPT: MARMITTE_FIND_POINT

// argument0: car_index, che è la variabile che contiene l' object_index dell'oggetto interessato al quale applicare l'altro
// argument1: car_index.x
// argument2: car_index.y
// argument3: x
// argument4: y
// argument5: object_index, serve a capire se è la marmitta di destra o quella di sinistra


if argument5=obj_marmitta{
    if argument0=obj_car_corvette   point = point_distance(argument1+20,argument2-1.8,argument3,argument4);
} 

else if argument5=obj_marmitta1{
    if argument0=obj_car_corvette    point = point_distance(argument1+20,argument2+2.2,argument3,argument4);
} 
      

return point; 


Codice: Seleziona tutto

// SCRIPT: MARMITTE_FIND_ANGLE
// argument0: car_index, che è la variabile che contiene l' object_index dell'oggetto interessato al quale applicare l'altro
// argument1: car_index.x
// argument2: car_index.y
// argument3: x
// argument4: y
// argument5: object_index, serve a capire se è la marmitta di destra o quella di sinistra


if argument5=obj_marmitta{
     if argument0=obj_car_corvette    angle = point_direction(argument1+20,argument2-1.8,argument3,argument4);
} 

else if argument5=obj_marmitta1{
     if argument0=obj_car_corvette    angle = point_direction(argument1+20,argument2+2.2,argument3,argument4);
}

     
return (angle);

In begin step metto questo:

Codice: Seleziona tutto

x=global.car_index.x+lengthdir_x(point,angle+global.car_index.roty);
y=global.car_index.y+lengthdir_y(point,angle+global.car_index.roty);
In step questo:

Codice: Seleziona tutto

if global.block_rot=-1 roty=global.car_index.roty;




Nel momento in cui l'oggetto è fermo gli oggetti da attaccare vanno correttamente nelle loro posizioni...
Ma quando è in movimento le posizioni degli oggetti attaccati sembrano cambiare leggermente all'aumentare della velocità dei cambi di direzione ed accelerazione...

Vi spiego meglio: l'oggetto interessato, una macchina, ha degli oggetti "attaccati" quali marmitte, alettoni, prese d'aria, ruote ecc...
Supponiamo che l'auto stia accelerando: le ruote piano piano sembrano andare più lente della macchina e quindi scivolano indietro, per poi recuperare la loro posizione iniziale non appena l'auto si ferma. Ho ovviato a questo semplicemente mettendo il seguente codice in begin step invece che in step.

Codice: Seleziona tutto

x=global.car_index.x+lengthdir_x(point,angle+global.car_index.roty);
y=global.car_index.y+lengthdir_y(point,angle+global.car_index.roty);
Invece, per quanto riguarda la posizione laterale, non riesco ad aggiornarla correttamente.. Ecco due screenshot che mostrano il fatto:
Immagine
Immagine
draw_text(100,100,"fra3point");

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

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da civic71 »

Supponiamo che l'auto stia accelerando: le ruote piano piano sembrano andare più lente della macchina e quindi scivolano indietro, per poi recuperare la loro posizione iniziale non appena l'auto si ferma
Anch'io avevo avuto tali problemi ... infatti un una mia demo di car volevo che le ruote fossero degli object separati (affinche potessi farle ruotare anche in base alla curva )... ma appunto per quel problema ho dovuto realizzare un unico file auto.an8 comprensiva di ruote animate . Infatti esse girano in base alla velocità ma non sterzano ( :roll: Anche se poi avrei potuto aumentare le animazioni....).


Se tu non avessi troppi object da aggiungere alla vettura , potresti creare l' auto già con essi.Rendendoli però visibili ( tramite il suo Materiale ) solo in determinati casi.
E' vero però che se l'auto ha molti object da dover aggiungere (per esempio 5 modelli differenti di marmitte), questa potrebbe divenire troppo pesante con relativi rallentamenti (FPS).

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da maz85 »

Dovrebbe bastare eseguire il riposizionamento in uno step event dell'oggetto auto:

Codice: Seleziona tutto

//aggiorna pos macchina
x=macchina_x();
y=macchina_y();

with(accessorio){
  x=calcola_x();
  y=calcola_y();
  Step();
}

Step();

Oppure tutto il calcolo delle posizioni in begin step e poi aggiornare con Step() ad entrambi sullo step event.

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

Re: [U3D] Attaccare oggetti ad altri

Messaggio da Jak »

Guardati il capitolo su matrici e vettori. Prima di step basta che trasformi la matrice del tuo oggetto usando un'unica matrice in comune per tutto l'oggetto. Poi ti basterà cambiare la matrice principale per risolvere tutto.
Visto che certe cose non vi sono venute in mente e che le matrici non sono un'argomento facile(quanti porconi ho tirato quando facevo baller) credo proprio che mi toccherà fare un'esempio vero? :lol:
Magari ci faccio proprio una serie di script per rendere più facile l'utilizzo.
EDIT: niente script, ora che ci penso bisogna che modificate un bel po di cose manualmente e cose così, provo a buttare giu qualcosa ma mi sa che gli script sono più complicati del resto del codice in generale :lol:
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
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da guidox »

Cavolo che bella grafica con U3D. :fapensare:
Ma sono troppo svogliato per leggere l' inglese... :roll:
Immagine

Immagine

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] Attaccare oggetti ad altri

Messaggio da fra3point »

@civic71: ho già provato con i modelli più complessi ma ci ho rinunciato proprio a causa dei rallentamenti... :|

@maz: ora provo questo metodo!

@jak: proverò anche con le matrici... Ebbene.. le dovrò studiare da 0, non le ho mai usate ma non è mai troppo tardi..

@guidox: grazie! P.S. il gioco è in italiano, non in inglese! ;)
draw_text(100,100,"fra3point");

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

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da guidox »

fra3point ha scritto:@guidox: grazie! P.S. il gioco è in italiano, non in inglese! ;)
Mi riferivo al manuale di U3D. :lol:
Una volta avevo cominciato a studiarlo ma mi pesa troppo...
Immagine

Immagine

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da civic71 »

Guardati il capitolo su matrici e vettori. Prima di step basta che trasformi la matrice del tuo oggetto usando un'unica matrice in comune per tutto l'oggetto.
Intendi la manipolazione geometrica della maglia e dei suoi vertici tramite
LockMesh (LockedMeshIndex, MeshIndex, Frame, Lod ) ?

Però poi se si modifica e si "blocca" una mesh , questa risulterà modificata anche per le altre automobili presenti nel gioco che utilizzano lo stesso file.3d ;

Comunque sarebbe utile che facessi un esempio :)

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

Re: [U3D] Attaccare oggetti ad altri

Messaggio da Jak »

No civic, intendo proprio usare le funzioni per modificare le matrici di trasformazione di un modello, praticamente quelle cose che ruotano/scalano/traslano un modello 3d. Ogni modello 3d è completamente "statico" e per disegnarlo in un'altro punto devi dire alla scheda video di trasformare al momento del disegno in modo da poter avere più istanze di una stessa mesh ma ruotata, scalata e traslata.
Se ti ricordi le trasformazioni del d3d sappi che u3d usa quelle solo che le usa automaticamente dentro la dll. L'insieme di dati che indica la trasformazione di un modello si chiama appunto matrice ed ogni istanza ha la sua, io andrò a modificare quella :baron:

Ovviamente il codice andrà fatto ad ogni step su gm quindi dopo che avrò fatto l'esempio (domani, ora non ho tempo) dovrai far si che il codice delle istanze collegate ad un'altro modello avvenga dopo lo "step" del modello principale.

Comunque non spaventatevi, le matrici non sono difficili da utilizzare una volta capito come funzionano :D

PS: tempo che fu ho provato ad usare i LockMesh... Un disastro, a parte il fatto che mi ha detto civic cioè che modifico tutte le istanze il tutto è lentissimo se fatto per ogni vertice anche per modelli con pochissimi vertici. Il processore ti si fonde, è utile solo per creare una mesh da 0.
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
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da civic71 »

intendo proprio usare le funzioni per modificare le matrici di trasformazione di un modello,
Non le conosco :roll:
tempo che fu ho provato ad usare i LockMesh... Un disastro
Mi hai fatto passare la voglia di fare dei test :shock:


:fapensare: In ogni caso mi è venuto una semplice idea ma fattibile solo con file.an8 visto che questi sono facilmente modificabili :
Basterebbe editare un nuovo file.an8 sommando il file.an8 di un auto ed il file.an8 di un suo optional ( marmitte , spoiler , ecc... ). Ho già fatto dei test a mano con 2 file.an8 per crearne un terzo . Ho dovuto però e logicamente escludere la parte iniziale del secondo file.an8 , affinchè il risultato fosse senza errori.
Per far creare tale file.an8 con il GML , basterebbe utilizzare le semplici funzioni per il caricamento ed il salvataggio di file.txt

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

Re: [U3D] Attaccare oggetti ad altri

Messaggio da Jak »

Oppure si potrebbe cambiare settare l'alfa dei materiali dei pezzi aggiuntivi a 0 quando non li usi :D Comunque sta cosa delle matrci potrebbe essere utile quindi la faccio comunque(anche perchè non spreca memoria ed è velocissima :D )
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
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da fra3point »

grazie jak! un bell'esempio per l'uso delle matrici sarebbe l'ideale! Magari in quel modo posso complicare di più il gioco, senza dover pensare a ridurlo al minimo a causa dei problemi dovuti alla posizione degli altri oggetti..
In più potrebbe servire a chiunque voglia creare un gioco di auto! ;)

@civic71: premetto che i file .an8 li uso pochissimo e che, lavorando con modelli abbastanza complessi ho bisogno di gestire tali modelli nel modo più facile possibile per non complicarmi la vita... Per questo opto per il formato .u3d. In questo modo setto tutti i parametri grafici (shader, bump mapping, texture ecc.) direttamente nel modello, sfruttando il tool "u3d studio".
Poi ho anche notato che in u3d studio i file .an8 non me li importa... ma questo non fa parte del topic! :)
draw_text(100,100,"fra3point");

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

Saw: The Game --> 60%

Tropic Races --> 40%

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

Re: [U3D] Attaccare oggetti ad altri

Messaggio da Jak »

Dopo aver fatto vari test ed ottimizzazione del codice(tra l'altro non ho più il gmk di baller, visto che tanto usavo gmogre l'avrò buttato via, pazienza)ho fatto il mio bellissimo esempio.
http://www.megaupload.com/?d=J0INYEGV
L'oggetto "modello_principale" è il modello principale appunto al quale andranno "attaccati" i vari "modello_figlio".
L'oggetto "crea_figli" serve solo a creare vari oggetti figli i quali sono posizionati in coordinate "assolute" e non relative poichè ci penserà il codice in step event dell'oggetto figlio a dargli la relatività.
L'oggetto figlio è composto in tutto (escludendo il controllo) da ben 3 funzioni e non è nemmeno necessario usare lo script Step()
Per maggiori dettagli sul funzionamento è tutto commentato quindi non avete problemi.

Provate a scalare/spostare/ruotare l'oggetto principale e vedrete che le sfere restano attaccate e modificate alla perfezione :cappa:

Dimenticavo "E' NECESSARIO USARE LA GEX DI U3D ED E' FATTO CON :gm8: "
@civic: se hai ancora gm5 non so come aiutarti, ti manderò in PM le caratteristiche dei vari oggetti se vuoi così te li fai te a mano. Se hai gm6 posso dargli una rispolveratina e ti faccio un'esempio su misura :roll:
EDIT: oppure se hai gm5 ti scarichi gm8 lite e ti guardi il codice e lo ricopi su gm5 :lol:
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
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da maz85 »

Non ho guardato, ma non ci stava già la funzione:
- prendi matrice posizione oggetto X
- applica matrice ottenuta a oggetto Y
?

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

Re: [U3D] Attaccare oggetti ad altri

Messaggio da Jak »

maz85 ha scritto:Non ho guardato, ma non ci stava già la funzione:
- prendi matrice posizione oggetto X
- applica matrice ottenuta a oggetto Y
?
Si che ci stava ma in quel caso si otterrebbe che gli oggetti "figli" stavano nello stesso posto/scala/rotazione dell'oggetto padre. A fra3point serviva che fossero attaccati quindi applicando anche dei valori relativi in base all'oggetto.
Il mio codice funziona praticamente come dici te solo che ho aggiunto questa cosa :lol:

Comunque ora che ci penso è vero, non bastava mettere la maglia in una posizione giusta rispetto alla macchina e poi usare le stesse variabili? :fapensare:
Il mio è consigliato per cose "dinamiche" comunque sono poche semplici righe di codice quindi male non fa. :sisisi:
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
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da fra3point »

ho provato il tuo esempio, jak! E' proprio ciò che mi serviva... Grazie per aver perso un po' del tuo tempo! domani lo studierò, capirò come funziona e lo applicherò al meglio nel mio gioco!
Dovrò cambiare totalmente il metodo che stavo adoperando, ma meglio così! :)

EDIT: Ho provato il codice.. senza la gex funziona ma il problema rimane lo stesso... Ora provo con la gex.. Comunque.. che cambia se usi la gex o gli script?
draw_text(100,100,"fra3point");

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

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da civic71 »

Ho scaricato il tuo file ma il mio 7-Zip non lo supportava più;
Ho quindi scaricato l'ultima versione di 7-Zip potendolo così scompattare :)
A questo punto ho ieri provato a scaricare gm8 senza mai riuscirci :(
Oggi ho capito che l' antivirus mi bloccava il donwload di gm8 :furioso: .
Ho quindi provveduto a disinserirlo , riuscendo così a scaricarmi gm8 :)
L' ho installato , poi ho aperto il tuo file , quindi l'ho copiato per una versione di gm_5.0 , potendo così visualizzare il TestMatrici :)

Grazie mi sarà di esempio :D

Quella parte del manuale non l' avevo mai tradotta ne studiata :manual:
Il mio è consigliato per cose "dinamiche"
Quindi se un "figlio" (ipotizzando una ruota di una car ) ha delle animazioni ,questa continuerebbe ad avere la sua animazione ....ottimo...Ma si potrebbe modificarne la roty o rotx e la rotz a piacimento senza che l'oggetto si distacchi dal "padre" (oggetto car) ? :fapensare: INTERESSANTE :rockrock:


fra3point :
Ho provato il codice.. senza la gex funziona ma il problema rimane lo stesso... Ora provo con la gex.. Comunque.. che cambia se usi la gex o gli script?
Io ho spostato il tutto su gm5.0 con gli script di U3D , perchè non si può utilizzare la gex. Deduco quindi che la gex contenga solo gli script :roll:

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

Re: [U3D] Attaccare oggetti ad altri

Messaggio da Jak »

Il gmk che vi ho postato tuilizza la gex quindi non potete farlo partire e basta se non avete la gex. Chiaro che se ricopiate il codice usando gli script è la stessa identica cosa.
civic71 ha scritto:Quindi se un "figlio" (ipotizzando una ruota di una car ) ha delle animazioni ,questa continuerebbe ad avere la sua animazione ....ottimo...Ma si potrebbe modificarne la roty o rotx e la rotz a piacimento senza che l'oggetto si distacchi dal "padre" (oggetto car) ? :fapensare: INTERESSANTE :rockrock:
:rockrock: Già, il mitico U3D :metalgo:

Comunque mi sembra strano che non ti vada bene fra3point. Il mio esempio funzionava perfettamnete anche scalando ruotando traslando e tutto il resto(che non cè ma se ci fosse funzionerebbe :lol: )
Noto comunque che non sono spostate a destra ma ruotate di qualche grado. Non è che hai sbagliato a settare qualche variabile? E' l'unica cosa possibile a mio parere :confuso:
Nel tuo specifico caso a parte l'esistenza non dovresti mai muovere in nessun modo la marmitta(se non per la posizione iniziale) poichè poi ci pensa il mio codice a fare tutto da solo. :fapensare:
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
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] Attaccare oggetti ad altri

Messaggio da fra3point »

no non sono proprio ruotate.. sono in ritardo rispetto all'oggetto macchina.. tutto qui.. e il metodo delle matrici, ho fatto delle prove, risulta ininfluente, cioè modifica posizione e rotazione dell'obj figlio relativamente all'obj macchina ma quel problema del "ritardo" persiste...
Insomma.. mi sembra che a livello di risultati finali il tuo codice sia identico a quello che usavo in precedenza.. Eppure nel tuo esempio funziona tutto perfettamente..

EDIT: Ho notato che nello step event del mio "oggetto-figlio", dato che deve eseguire anche altre cose, oltre al tuo codice, ho inserito Step(); Che sia forse quello che fa la differenza?
draw_text(100,100,"fra3point");

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

Saw: The Game --> 60%

Tropic Races --> 40%

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

Re: [U3D] Attaccare oggetti ad altri

Messaggio da Jak »

fra3point ha scritto:EDIT: Ho notato che nello step event del mio "oggetto-figlio", dato che deve eseguire anche altre cose, oltre al tuo codice, ho inserito Step(); Che sia forse quello che fa la differenza?
Sì, fa la differenza. Tra i commenti ho infatti messo che non devi metterlo. Inoltre ricorda che i figli devono avere un'id più alto del padre sennò i ritardi sono ovvi :sisisi:
Se proprio non puoi prova a mettere il codice in end step anzichè in step :sisisi:
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

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 19 ospiti