Fisica della piastrellatura usando Farseer


9

Sto riscontrando un problema con Farseer Physics Engine, in cui in un ambiente piastrellato il mio oggetto a volte interagirà con gli angoli di altri oggetti, anche se si allineano perfettamente.

Fisica della piastrellatura usando Farseer

Ho letto di persone che suggeriscono di calcolare e creare un oggetto più grande, usando Marching Squares o qualcosa di simile. Questa non è un'opzione tuttavia, poiché vorrei che ogni piastrella avesse qualità fisiche diverse, come attrito e restituzione diversi.

La mia domanda è: che cosa la causa esattamente, sono problemi di precisione fluttuanti o qualcos'altro? E c'è un modo per risolverlo, senza rompere l'intero motore fisico?


Mi chiedo se potresti semplicemente espandere le scatole di collisione di un pixel, quindi si sovrappongono un po '. Potrebbe vedere la superficie come forse più connessa.
Doug.McFarlane,

@Doug: l'ho appena provato e non ha fatto alcuna differenza.
William Mariager,

Le piastrelle del terreno sono corpi statici?
Bummzack,

@bummzack: Sì, lo sono.
William Mariager,

Sto avendo lo stesso esatto problema. Ottengo l'effetto "rimbalzo" quando il mio oggetto mobile è un rettangolo o un cerchio. Inoltre, non posso convertire più quadrati in un rettangolo grande perché voglio che il giocatore abbia la possibilità di "rimuovere" singole tessere in determinate situazioni.

Risposte:


5

Farseer utilizza un solutore iterativo, quindi quando la ruota inizia a scontrarsi con un altro rettangolo ad alta velocità, di volta in volta vedrai dei dossi poiché è un "allineamento perfetto" per noi, non per una simulazione fisica, con iterazioni cose come queste mai essere "perfetto per i pixel".

Dovrai convertire i rettangoli in forme Edge / Loop e quindi modellare diverse qualità fisiche con hack come la creazione di limiti di tessere artificiali e la modifica delle proprietà quando il personaggio entra in un riquadro di delimitazione, ma non tutte le qualità fisiche possono essere emulate in questo modo.

Prima o poi finirai per scrivere la tua fisica basata su tessere anziché Farseer. Se il tuo gioco non ha molti enigmi fisici complessi, sarà più semplice abbandonare Farseer completamente e lanciare la tua fisica basata su tessere.


In realtà ho iniziato a programmare il mio motore fisico, in particolare per questo motore di piastrellatura, poiché non sembra che ci siano soluzioni eleganti.
William Mariager,

Ho deciso di contrassegnare questa come risposta, poiché non sembra esserci alcuna soluzione semplice e farai meglio a scrivere la tua soluzione. Oppure accetta che non puoi avere una fisica diversa e utilizzare Marching Squares per creare corpi più grandi.
William Mariager,

0

puoi ottimizzare le forme delle tue collisioni, questa scena può essere fatta con solo quattro rettangoli.

puoi unire le caselle correlative per ingrandirne una.

questo video lo mostra http://www.youtube.com/watch?v=eyhGckHgkkE

quando si aggiungono le caselle è possibile vedere un rettangolo azzurro con la forma ottimizzata.


1
Come ho detto nel terzo paragrafo, trasformare un gruppo di oggetti in un oggetto più grande non è un'opzione, poiché perderei le singole proprietà.
William Mariager,

puoi raggrupparli anche per le loro proprietà fisiche. penso che non sia molto normale avere molti blocchi fisici diversi insieme.
Blau,

Raggrupparli per qualità fisiche mi darebbe lo stesso problema se il terreno cambia molto in un tratto. Può essere insolito, ma è comunque quello di cui ho bisogno.
William Mariager,

0

Hmm ... sospetto che potrebbe avere qualcosa a che fare con il tuo cerchio e non con le tessere sottostanti. Prova a costruire il terreno usando un solo scafo e vedi se ottieni gli stessi risultati. Altrimenti, sono le tessere come sospetti. In tal caso, la tua cerchia non è rotonda come potresti pensare.


L'ho provato. Usando un rettangolo grande non ci sono problemi.
William Mariager,

k, Le piastrelle sono il problema allora
John McDonald,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.