
Physac-это небольшой 2D-физический двигатель, написанный в Pure C. Двигатель использует фиксированную репутацию резьбового потока для физики симпута. Физический шаг содержит следующие этапы: Получить информацию о столкновении, применить динамику, решение столкновений и коррекция положения. Он использует очень простую структуру для физических тел с вектором положения, который будет использоваться в любом 3D -рендеринге.
Файл заголовка включает в себя некоторые значения настройки, чтобы соответствовать результатам, которые пользователь хочет с минимальными плохими результатами. Большинство из этих значений прокомментированы с небольшим объяснением их использования.
Примечание. Пример кода использует библиотеку программирования Raylib для создания окна программы и структуры рендеринга.
Physac требует raylib. Чтобы получить его, выполните следующие шаги:
* 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.
Структура физики содержит всю информацию о динамике и форме столкновения. Пользователь должен использовать следующие компоненты структуры:
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 ;Заголовок содержит несколько настраиваемых значений определения. Я установил значения, которые принесли мне лучшие результаты.
#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 содержит определение для функций управления памятью (Malloc, Free), чтобы предоставить пользователю возможность реализовать свои собственные функции памяти:
#define PHYSAC_MALLOC ( size ) malloc(size)
#define PHYSAC_FREE ( ptr ) free(ptr)Физорные функции API доступны для пользователя следующие:
// 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 );Примечание: initphysics () должен быть вызван в программе Start и Closephysics () до завершения программы. Закрытие и инициализация PhysAC во время программы не влияет на какую -либо ошибку (полезно в качестве «сброса» для уничтожения любого созданного тела пользователем во время выполнения).
Physac использует следующие библиотеки C для управления памятью, математические операции и некоторые функции отладки:
Он не зависит от любого графического двигателя и готов использовать любой графический API и использовать информацию о вершинах (посмотрите на логику рисования примеров), чтобы нарисовать линии или формы на экране. Например, эта информация о вершинах может использоваться в API API OpenGL GLVERTEX2F ().
Кстати, я использую Raylib для создания примеров. Эта библиотека программирования видеогменов используется для обработки входов, управления окнами и графического чертежа (с использованием API OpenGL).