2015-08-13 19 views
11

Diciamo che ho un SKSpriteNode che rappresenta una ruota di automobile, con un SKPhysicsBody circolare collegato con successo ad esso. Il genere sarebbe spostando lateralmente il gioco/simulatore di guida in auto 2d, ovviamente.Un modo per applicare zRotation in modo che influisca su SKPhysicsBody di conseguenza?

Quello che voglio è calcolare tutta la fisica del motore da solo senza ricorrere ancora al motore fisico SpriteKit. Mi piacerebbe avere il pieno controllo su come vengono calcolati i meccanismi del motore, della frizione, della trasmissione, ecc., Fino al regime della ruota motrice.

Da quel momento in avanti, però, darei volentieri il controllo al motore fisico SpriteKit, che calcolerebbe quindi ciò che accade, quando la ruota motrice girevole porta la superficie della strada. L'auto avanza, rallenta, accelera e/o le ruote scivolano, a seconda dei casi.

Calcolare la meccanica per ottenere il numero di giri della ruota non è un problema. Non sono sicuro su come andare da lì.

sono in grado di ruotare la ruota semplicemente applicando zRotation nell'aggiornamento: metodo, in questo modo:

self.rearWheelInstance.zRotation += (self.theCar.wheelRPS/6.283 * timeSinceLastUpdate); // revolutions/2pi = radians 

In questo modo sono in grado di applicare la RPM esatto Ho calcolato in precedenza. Lo svantaggio evidente è che il motore fisico di SpriteKit è totalmente ignaro di questa rotazione. Per quanto ne sappia, la ruota si teletrasporta da una fase all'altra, quindi non crea attrito con la superficie stradale o qualsiasi altra interazione con altri corpi fisici di SpriteKit, del resto.

D'altra parte, può applicare la coppia alla ruota:

[self.rearWheelInstance.physicsBody applyTorque: someTorque]; 

o impulso angolare:

[self.rearWheelInstance.physicsBody applyAngularImpulse: someAngularImpulse]; 

Ciò ruotare la ruota in modo che SpriteKit fisica motore comprende, pertanto facendolo interagire correttamente con l'ambiente circostante.

Ma a meno che non manchi qualcosa di ovvio, questo considera la ruota come un "oggetto a rotazione libera" indipendente dal motore, dalla trasmissione o dal numero di giri dell'asse motore. In realtà, però, la ruota non ha la "scelta" di rotolare a qualsiasi RPM rispetto a quello che viene trasmesso attraverso la trasmissione all'asse (a meno che la trasmissione non sia in folle, il pedale della frizione sia abbassato o la frizione stia scivolando, ma quelli sono intere altre storie).

Quindi: 1) Sono in grado di manipolare in qualche modo zRotation in modo che il motore fisico SpriteKit 'capisca' come movimento rotatorio?

o

2) Ho un chiaro difetto nella mia logica che indica che questo non è quello che dovrei essere cercando, in primo luogo? In tal caso, potresti essere così gentile da indicarmi i difetti in modo da poter adottare una pratica migliore?

risposta

4

Dopo un bel po 'di vicoli cieco ho notato che in effetti c'è un modo per manipolare direttamente la rotazione della ruota (al contrario di applicare la coppia o l'impatto) in un modo che influenza il motore fisico di conseguenza.

Il trucco è quello di manipolare la proprietà angularVelocity del physicsBody della ruota, in questo modo:

self.rearWheelInstance.physicsBody.angularVelocity = -self.theCar.wheelRadPS; 
// Wheel's angular velocity, radians per second 
// *-1 just to flip ccw rotation to cw rotation 

In questo modo sono in controllo diretto della velocità di rotazione delle ruote motrici senza perdere la loro capacità di interagire con altri corpi nella simulazione fisica SpriteKit. Questo mi ha aiutato a superare questo ostacolo, spero che aiuti anche qualcun altro.

9

Risposta semplice, la miscelazione delle impostazioni dell'interfaccia utente 2D, come posizione e zRotazione, con un sistema fisico dinamico non avrà i risultati desiderati, come notato. Come affermi, dovrai utilizzare i pezzi della simulazione fisica, come impulso e momento angolare.

I due pezzi del puzzle che possono anche aiutare sono:

Physics Joints - questi possono fare cose come collegare una ruota per un axel in modo che possa ruotare liberamente, limiti impostati a rotazione, ma ancora impartire rotazione forze su di esso.

Dynamically Adjusting Physics Properties - come aumentare l'attrito, lo smorzamento angolare o l'aggiunta di accelerazione negativa sull'asse mentre l'utente preme i freni.

+0

Grazie, ho avuto la sensazione che questo fosse il caso. Sto ancora riflettendo sulla fase esatta in cui dare il controllo del motore di fisica SK, e come farlo senza perdere la precisione che cerco. –