
O Physac é um pequeno mecanismo de física 2D escrito em Pure C. O motor usa um loop de encadeamento de tempo fixo para simlear a física. Uma etapa de física contém as seguintes fases: Obtenha informações de colisão, aplique dinâmica, resolução de colisão e correção de posição. Ele usa uma estrutura muito simples para corpos físicos com um vetor de posição a ser usado em qualquer API de renderização 3D.
O arquivo de cabeçalho inclui alguns valores de definição de ajustes para ajustar os resultados que o usuário deseja com um mínimo de resultados ruins. A maioria desses valores é comentada com uma pequena explicação sobre seus usos.
Nota: O código de exemplo usa a Biblioteca de Programação Raylib para criar a janela do programa e a estrutura de renderização.
Physac requer Raylib. Para obtê -lo, siga os próximos passos:
* 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.
A estrutura do corpo da física contém todas as informações dinâmicas e formato de colisão. O usuário deve usar os seguintes componentes da estrutura:
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 ;O cabeçalho contém alguns valores de defina personalizáveis. Defino os valores que me conquistaram os melhores 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.4fO Physac contém define para as funções de gerenciamento de memória (MALLOC, GRATUITAMENTE) para trazer ao usuário a oportunidade de implementar suas próprias funções de memória:
#define PHYSAC_MALLOC ( size ) malloc(size)
#define PHYSAC_FREE ( ptr ) free(ptr)As funções da API do PHYSAC disponíveis para o usuário são as seguintes:
// 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: O initphysics () precisa ser chamado no programa START e ClosePhysics () antes do término do programa. Fechar e inicializar o PHYSAC durante o fluxo do programa não afeta ou produz nenhum erro (útil como uma 'redefinição' para destruir qualquer corpo criado pelo usuário no tempo de execução).
O PHYSAC usa as seguintes bibliotecas C para gerenciamento de memória, operações de matemática e alguns recursos de depuração:
É independente de qualquer mecanismo gráfico e preparado para usar qualquer API gráfica e usar as informações dos vértices (veja os exemplos de desenho de lógica) para desenhar linhas ou formas na tela. Por exemplo, essas informações sobre vértices podem ser usadas no OpenGL API GLVERTEX2F ().
A propósito, eu uso Raylib para criar os exemplos. Esta biblioteca de programação de videogames é usada para lidar com entradas, gerenciamento de janelas e desenho de gráficos (usando a API OpenGL).