Orario: 19-05-2013, 21:43 Benvenuto ospite! (Log inRegistrati)


Rispondi 
Box2d: Strani comportamenti corpi circolari
Autore Messaggio
_tommo_
Mod nerdcore

Messaggi: 5,877
Registrato: Nov 2008
Offline Offline
#16 RE: Box2d: Pulley Joint. Come funziona?
0
In effetti nel tuo codice non si capisce niente, ci sono diversi errori concettuali sparsi in giro...

-const float32& è stupido perchè non ha senso passare un tipo primitivo per reference, e nemmeno passarlo const.

-fixtureDef dovrebbe essere creato nuovamente per ogni fixture, invece lo ricicli in CreateDynamicCircle per risparmiare cosa?
Crealo ogni volta e basta, probabilmente l'errore è li in giro.

-i vari RATIO che metti sparsi in giro non hanno senso alcuno.
Nelle simulazioni fisiche non c'è il concetto di scaling, e pure se ci fosse di certo non si applica alle posizioni. pos_x/RATIO non si può assolutamente vedere Asd
Per di più è anche variabile, è un parametro della funzione...

Vediamo se si trova meglio l'errore così? Copiare tutto nel main non mi sembra una gran soluzione, si mischia tutto ancora meglio.

Tommaso Checchi
< devlog | twitter | Dojo, a C++ game framework >
(Questo messaggio è stato modificato l'ultima volta il: 01-08-2011 0:05 da _tommo_.)
01-08-2011 0:04
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
PeppeTH
Junior Member

Messaggi: 40
Registrato: Feb 2011
Offline Offline
#17 RE: Box2d: Pulley Joint. Come funziona?
0
(01-08-2011 0:04)_tommo_ ha scritto:  In effetti nel tuo codice non si capisce niente, ci sono diversi errori concettuali sparsi in giro...

-const float32& è stupido perchè non ha senso passare un tipo primitivo per reference, e nemmeno passarlo const.
Quì ammetto la mia ignoranza, credevo che passando un dato ad una funzione per riferimento e passandolo costante avrei evitato di far fare una copia al dato e non aver rischiato che il dato che venga modificato. Ma evidentemente così non è o probabilmente non lo è in questo caso.

-fixtureDef dovrebbe essere creato nuovamente per ogni fixture, invece lo ricicli in CreateDynamicCircle per risparmiare cosa?
Crealo ogni volta e basta, probabilmente l'errore è li in giro.
Uhm ho creato una classe dove ci sono le varie funzioni per creare dei corpi con "semplicità". Ogni attore/cosa del futuro gioco erediterà questa classe. Effettivamente non avevo preso in considerazione che un corpo può avere più fixuture.

-i vari RATIO che metti sparsi in giro non hanno senso alcuno.
Nelle simulazioni fisiche non c'è il concetto di scaling, e pure se ci fosse di certo non si applica alle posizioni. pos_x/RATIO non si può assolutamente vedere Asd
Per di più è anche variabile, è un parametro della funzione...
Perchè non si applica alle posizioni? se voglio creare un corpo ad una determinata posizione in pixel devo dividere per RATIO(che è un membro statico e costante della classe, quindi non è variabile). Non è così?

Vediamo se si trova meglio l'errore così? Copiare tutto nel main non mi sembra una gran soluzione, si mischia tutto ancora meglio.
Fatemi un po' di chiarezza sto facendo confusione Dead
01-08-2011 12:57
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
encelo
Main(die)stream

Messaggi: 3,251
Registrato: Nov 2008
Offline Offline
#18 RE: Box2d: Pulley Joint. Come funziona?
0
(01-08-2011 12:57)PeppeTH ha scritto:  credevo che passando un dato ad una funzione per riferimento e passandolo costante avrei evitato di far fare una copia al dato e non aver rischiato che il dato che venga modificato. Ma evidentemente così non è o probabilmente non lo è in questo caso.

Se volevi passare il riferimento per risparmiare sulla copia non ha senso: i 32 bit del dato floating point sono gli stessi di un puntatore su un sistema a 32bit ed addirittura meno di un puntatore a 64 bit. Smile
Se volevi farlo per evitare la modifica non aveva senso lo stesso: se passi una copia l'originale non è modificabile.

Se invece intendevi modificarlo, allora avresti dovuto passare proprio il riferimento (o il puntatore), ovviamente senza modificatore const.

Angelo "Encelo" Theodorou
.: Blog | Twitter | LinkedIn | Ohloh | Last.FM | Vimeo | Steam :.
All problems in computer graphics can be solved with a matrix inversion. - James Blinn
01-08-2011 13:28
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
_tommo_
Mod nerdcore

Messaggi: 5,877
Registrato: Nov 2008
Offline Offline
#19 RE: Box2d: Pulley Joint. Come funziona?
0
1) una reference è un puntatore, praticamente, quindi è grande sizeof( void* ) e viene sempre passato per copia, e inoltre all'interno della funzione costa una dereferenziazione quando vai a leggere la memoria puntata.
Quindi in un contesto a 64 bit, const float32& occupa 64 bit aggiuntivi oltre al float32 e necessita un'operazione aggiuntiva per essere letto da memoria. Non esattamente una cosa furba Asd
I dati primitivi come int, float, bool, char etc vanno sempre passati per copia, cioè il classico foo( float f ).
Così aiuti anche il compilatore a fare l'inlining, visto che può passare i parametri dentro gli appositi registri del processore e risparmiare un mucchio di letture e scritture sullo Stack.
Probabilmente riesce a farlo anche con le reference, ma non vedo perchè complicargli la vita.

2) premature optimization is the source of all evils.
Devi individuare qual'è il "contratto concettuale" di quello che vuoi fare, e poi farlo.
In questo caso quello che vuoi fare è "creare un nuovo oggetto con una nuova fixture" e riciclare la fixture è esattamente un caso di premature optimization.
Perchè la ricicli? Sei sicuro che sia pesante? Sei sicuro che sia complesso? Hai fatto dei test?
Se non hai motivi per ottimizzare, non ottimizzare Linguaccia

3) no, non è corretto scalare le posizioni, o almeno, dipende da che devi fare... dividendo tutte le posizioni per un ratio costante (ma allora perchè è un parametro della funzione?) scali lo spazio delle posizioni di ingresso...
però poi la fisica non è scalata, quindi quello che fai è una cosa abbastanza incoerente, visto che sostanzialmente ti limiti a spostare le cose, scalandole.
Se poi ratio non è nemmeno costante, allora è semplicemente privo di senso.

Quello che ti suggerisco è di togliere ratio in toto da tutto, e usare il sistema metrico del motore fisico.
Quando vuoi creare un oggetto ad una data posizione in pixel, dividi la posizione e POI la passi alle funzioni fisiche. "rendere partecipi" funzioni come CreateCircleEtc del rapporto metri/pixel non ha veramente alcun senso.

In sostanza la diagnosi di TheCrib è corretta: devi studiarti il C++ (o magari un linguaggio a oggetti più semplice) per bene perchè ti mancano un pò le basi Ahsisi

Tommaso Checchi
< devlog | twitter | Dojo, a C++ game framework >
(Questo messaggio è stato modificato l'ultima volta il: 01-08-2011 13:29 da _tommo_.)
01-08-2011 13:28
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
PeppeTH
Junior Member

Messaggi: 40
Registrato: Feb 2011
Offline Offline
#20 RE: Box2d: Pulley Joint. Come funziona?
0
(01-08-2011 13:28)_tommo_ ha scritto:  cut
OK grazie per le delucidazioni.
Nel punto 2 l'intenzione non era riciclare la fixture ma pensavo si potesse ricavare qualche dato inizialmente, sto solo spermentando con la libreria Asd
(Questo messaggio è stato modificato l'ultima volta il: 01-08-2011 13:35 da PeppeTH.)
01-08-2011 13:34
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
PeppeTH
Junior Member

Messaggi: 40
Registrato: Feb 2011
Offline Offline
#21 RE: Box2d: Pulley Joint. Come funziona?
0
Come mi avete fatto notare il codice prendeva una brutta "piega". Ho apportato le dovute modifiche ma la sostanza non cambia. i corpi di forma circolare hanno strani comportamenti. Ora il corpo cade ma non collide con il terreno, oltre al fatto che utilizzando la debug draw il corpo viene stampato da un'altra parte (ma a questo ci penserò dopo, credo sia proprio una conseguenza dello strano comportamento, la classe mi sembra implementata per bene).
Per chi volesse darmi una mano sono passo tutto il progetto via pm, postare qui tutte le classi del progetto credo non sia leggibile.
Grazie in anticipo.
07-08-2011 18:39
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
PeppeTH
Junior Member

Messaggi: 40
Registrato: Feb 2011
Offline Offline
#22 RE: Box2d: Strani comportamenti corpi circolari
0
E l'errore fu risolto, sin dall'inizio ho pensato fosse nella funzione l'errore... e infatti è proprio lì.
Ecco la soluzione
Citazione:bodyDef.position.Set(posX, posY);
...
dynamicCircle.m_p.Set(posX, posY);

The arrangement above will give you a circle fixture at the position (posX+posX, posY+posY)
Is that what you were expecting?
Perhaps you might have intended this:

bodyDef.position.Set(posX, posY);
dynamicCircle.m_p.Set(0, 0);
(Questo messaggio è stato modificato l'ultima volta il: 08-08-2011 22:30 da PeppeTH.)
08-08-2011 22:30
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: