
Physac est un petit moteur de physique 2D écrit en Pure C. Le moteur utilise une boucle de thread à pas de temps fixe pour simluer la physique. Une étape physique contient les phases suivantes: obtenir des informations sur les collisions, appliquer la dynamique, la résolution de collision et la correction de position. Il utilise une structure très simple pour les corps physiques avec un vecteur de position à utiliser dans n'importe quelle API de rendu 3D.
Le fichier d'en-tête comprend certaines valeurs de définition de modification pour s'adapter aux résultats que l'utilisateur veut avec un mauvais résultat minimal. La plupart de ces valeurs sont commentées avec une petite explication sur leurs utilisations.
Remarque: L'exemple de code utilise la bibliothèque de programmation Raylib pour créer la fenêtre du programme et le cadre de rendu.
Physac nécessite Raylib. Pour l'obtenir, suivez les étapes suivantes:
* Go to [raylib](https://www.github.com/raysan5/raylib) and clone the repository.
* Ensure to pull the last changes of 'master' branch.
* Use code inside examples header comments to compile and execute.
La structure de PhysicsBody contient toutes les informations de dynamique et la forme de collision. L'utilisateur doit utiliser les composants de structure suivants:
typedef struct * PhysicsBody {
unsigned int id ;
bool enabled ; // Enabled dynamics state (collisions are calculated anyway)
Vector2 position ; // Physics body shape pivot
Vector2 velocity ; // Current linear velocity applied to position
Vector2 force ; // Current linear force (reset to 0 every step)
float angularVelocity ; // Current angular velocity applied to orient
float torque ; // Current angular force (reset to 0 every step)
float orient ; // Rotation in radians
float staticFriction ; // Friction when the body has not movement (0 to 1)
float dynamicFriction ; // Friction when the body has movement (0 to 1)
float restitution ; // Restitution coefficient of the body (0 to 1)
bool useGravity ; // Apply gravity force to dynamics
bool isGrounded ; // Physics grounded on other body state
bool freezeOrient ; // Physics rotation constraint
PhysicsShape shape ; // Physics body shape information (type, radius, vertices, normals)
} * PhysicsBody ;L'en-tête contient quelques valeurs de définition personnalisables. J'ai défini les valeurs qui m'ont donné les meilleurs résultats.
#define PHYSAC_MAX_BODIES 64
#define PHYSAC_MAX_MANIFOLDS 4096
#define PHYSAC_MAX_VERTICES 24
#define PHYSAC_CIRCLE_VERTICES 24
#define PHYSAC_COLLISION_ITERATIONS 100
#define PHYSAC_PENETRATION_ALLOWANCE 0.05f
#define PHYSAC_PENETRATION_CORRECTION 0.4fPhysac contient des définions pour les fonctions de gestion de la mémoire (Malloc, gratuitement) pour apporter à l'utilisateur la possibilité d'implémenter ses propres fonctions de mémoire:
#define PHYSAC_MALLOC ( size ) malloc(size)
#define PHYSAC_FREE ( ptr ) free(ptr)Les fonctions API PhysAC pour l'utilisateur sont les suivantes:
// Initializes physics values, pointers and creates physics loop thread
void InitPhysics ( void );
// Returns true if physics thread is currently enabled
bool IsPhysicsEnabled ( void );
// Sets physics global gravity force
void SetPhysicsGravity ( float x , float y );
// Creates a new circle physics body with generic parameters
PhysicsBody CreatePhysicsBodyCircle ( Vector2 pos , float radius , float density );
// Creates a new rectangle physics body with generic parameters
PhysicsBody CreatePhysicsBodyRectangle ( Vector2 pos , float width , float height , float density );
// Creates a new polygon physics body with generic parameters
PhysicsBody CreatePhysicsBodyPolygon ( Vector2 pos , float radius , int sides , float density );
// Adds a force to a physics body
void PhysicsAddForce ( PhysicsBody body , Vector2 force );
// Adds a angular force to a physics body
void PhysicsAddTorque ( PhysicsBody body , float amount );
// Shatters a polygon shape physics body to little physics bodies with explosion force
void PhysicsShatter ( PhysicsBody body , Vector2 position , float force );
// Returns the current amount of created physics bodies
int GetPhysicsBodiesCount ( void );
// Returns a physics body of the bodies pool at a specific index
PhysicsBody GetPhysicsBody ( int index );
// Returns the physics body shape type (PHYSICS_CIRCLE or PHYSICS_POLYGON)
int GetPhysicsShapeType ( int index );
// Returns the amount of vertices of a physics body shape
int GetPhysicsShapeVerticesCount ( int index );
// Returns transformed position of a body shape (body position + vertex transformed position)
Vector2 GetPhysicsShapeVertex ( PhysicsBody body , int vertex );
// Sets physics body shape transform based on radians parameter
void SetPhysicsBodyRotation ( PhysicsBody body , float radians );
// Unitializes and destroy a physics body
void DestroyPhysicsBody ( PhysicsBody body );
// Unitializes physics pointers and closes physics loop thread
void ClosePhysics ( void );Remarque: InitPhysics () doit être appelé au programme Start et Closphysics () avant la fin du programme. La fermeture et l'initialisation de Physac pendant le flux du programme n'affecte ni ne produit d'erreur (utile en tant que «réinitialisation» pour détruire tout corps créé par l'utilisateur lors de l'exécution).
Physac utilise les bibliothèques C suivantes pour la gestion de la mémoire, les opérations mathématiques et certaines fonctionnalités de débogage:
Il est indépendant à n'importe quel moteur graphique et prêt à utiliser n'importe quelle API graphique et à utiliser les informations des sommets (regardez les exemples de la logique de dessin) pour dessiner des lignes ou des formes dans l'écran. Par exemple, ces informations vertices peuvent être utilisées dans l'OpenGL API glvertex2f ().
Soit dit en passant, j'utilise Raylib pour créer les exemples. Cette bibliothèque de programmation de jeux vidéo est utilisée pour gérer les entrées, la gestion des fenêtres et le dessin graphique (à l'aide de l'API OpenGL).