
Physac es un pequeño motor de física 2D escrito en puro C. el motor utiliza un bucle de subprocesos de paso de tiempo fijo para simluizar la física. Un paso de física contiene las siguientes fases: obtener información de colisión, aplicar dinámica, resolución de colisiones y corrección de posición. Utiliza una estructura muy simple para cuerpos físicos con un vector de posición que se utilizará en cualquier API de representación 3D.
El archivo de encabezado incluye algunos valores de define ajustables para adaptarse a los resultados que el usuario desea con un resultado mínimo de malos resultados. La mayoría de esos valores se comentan con una pequeña explicación sobre sus usos.
Nota: El código de ejemplo utiliza la biblioteca de programación de Raylib para crear la ventana del programa y el marco de representación.
Physac requiere Raylib. Para obtenerlo, siga los siguientes pasos:
* 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 estructura de FisicsBody contiene toda la información de la dinámica y la forma de colisión. El usuario debe usar los siguientes componentes de estructura:
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 ;El encabezado contiene algunos valores definidos personalizables. Establecí los valores que me ganaron los mejores resultados.
#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 contiene define para las funciones de gestión de memoria (MALLOC, GRATIS) para brindar al usuario la oportunidad de implementar sus propias funciones de memoria:
#define PHYSAC_MALLOC ( size ) malloc(size)
#define PHYSAC_FREE ( ptr ) free(ptr)Las funciones de la API de PhysAC son los disponibles para el usuario:
// 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 );Nota: Initphysics () debe llamarse al programa Start and Closephysics () antes de que finalice el programa. Cerrar e inicializar a Physac durante el flujo del programa no afecta ni produce ningún error (útil como un 'reinicio' para destruir cualquier cuerpo creado por el usuario en tiempo de ejecución).
Physac utiliza las siguientes bibliotecas C para la gestión de memoria, operaciones de matemáticas y algunas características de depuración:
Es independiente de cualquier motor gráfico y está preparado para usar cualquier API de gráficos y usar la información de los Vértices (mire los ejemplos de lógica de dibujo) para dibujar líneas o formas en la pantalla. Por ejemplo, esta información de vértices se puede usar en OpenGL API Glvertex2f ().
Por cierto, uso Raylib para crear los ejemplos. Esta biblioteca de programación de videojuegos se utiliza para manejar entradas, administración de ventanas y dibujo de gráficos (usando la API OpenGL).