⚽ physics2d - 2D Fizik Motoru
Rigid Body, Collision Detection, Constraints, Forces
192
function
3,317
lines
109 KB
Boyut
🚀 Quick Start
import physics2d
// Dünya create
let dünya = physics2d.world_create([0.0, -9.81]) // Yerçekimi
// Zemin (statik body)
let zemin = physics2d.body_create_static()
let zemin_shape = physics2d.box_shape(10.0, 0.5)
physics2d.body_add_shape(zemin, zemin_shape)
physics2d.body_set_position(zemin, [0.0, -5.0])
physics2d.world_add_body(dünya, zemin)
// Kutu (dinamik body)
let kutu = physics2d.body_create_dynamic(1.0) // 1kg
let kutu_shape = physics2d.box_shape(1.0, 1.0)
physics2d.body_add_shape(kutu, kutu_shape)
physics2d.body_set_position(kutu, [0.0, 5.0])
physics2d.world_add_body(dünya, kutu)
// Simülasyon
let dt = 1.0 / 60.0 // 60 FPS
loop do
physics2d.world_step(dünya, dt)
let pos = physics2d.body_get_position(kutu)
yazdır("Kutu pozisyonu: " + pos[0].yazıya() + ", " + pos[1].yazıya())
if pos[1] < -10.0 do
kır
end
end
📚 Özellikler
- Rigid Body Dynamics: Kütle, hız, açısal momentum
- Shapes: Circle, Box, Polygon, Edge, Chain
- Collision Detection: Broad phase (AABB tree), narrow phase (SAT, GJK)
- Constraints: Distance joint, revolute joint, prismatic joint, weld joint
- Forces: Gravity, damping, friction, restitution
- Queries: Raycast, AABB query, shape query
💡 Exampleler
Angry Birds Tarzı Fırlatma
import physics2d, graphics
let dünya = physics2d.world_create([0.0, -9.81])
// Sapan noktası
let sapan_pos = [-5.0, 0.0]
// Kuş
let kuş = physics2d.body_create_dynamic(0.5)
let kuş_shape = physics2d.circle_shape(0.3)
physics2d.body_add_shape(kuş, kuş_shape)
physics2d.body_set_position(kuş, sapan_pos)
physics2d.world_add_body(dünya, kuş)
// Hedef (kutular)
function kutu_create(x: float, y: float) -> Body do
let body = physics2d.body_create_dynamic(1.0)
let shape = physics2d.box_shape(0.5, 0.5)
physics2d.body_add_shape(body, shape)
physics2d.body_set_position(body, [x, y])
physics2d.world_add_body(dünya, body)
return body
end
// Piramit
let kutular = []
each y in aralık(0, 5) for do
each x in aralık(0, 5 - y) for do
kutular.ekle(kutu_create(5.0 + x.float() - y.float() * 0.25, y.float() + 0.5))
end
end
// useıcı girdisi (mouse drag)
let mouse_down = false
let drag_start = [0.0, 0.0]
function mouse_press(pos: Dizi) do
mouse_down = true
drag_start = pos
end
function mouse_release(pos: Dizi) do
if mouse_down do
// Fırlatma hızını hesapla
let delta = [drag_start[0] - pos[0], drag_start[1] - pos[1]]
let velocity = [delta[0] * 10.0, delta[1] * 10.0]
physics2d.body_set_velocity(kuş, velocity)
mouse_down = false
end
end
// Render loop
loop do
physics2d.world_step(dünya, 1.0/60.0)
// Render kuş
let kuş_pos = physics2d.body_get_position(kuş)
graphics.draw_circle(kuş_pos[0], kuş_pos[1], 0.3)
// Render kutular
each kutu in kutular for do
let pos = physics2d.body_get_position(kutu)
let angle = physics2d.body_get_angle(kutu)
graphics.draw_box(pos[0], pos[1], 0.5, 0.5, angle)
end
end
Ragdoll Physics
import physics2d
function ragdoll_create(dünya: World, x: float, y: float) -> Ragdoll do
// Baş
let baş = physics2d.body_create_dynamic(5.0)
physics2d.body_add_shape(baş, physics2d.circle_shape(0.3))
physics2d.body_set_position(baş, [x, y + 1.5])
physics2d.world_add_body(dünya, baş)
// Gövde
let gövde = physics2d.body_create_dynamic(10.0)
physics2d.body_add_shape(gövde, physics2d.box_shape(0.4, 0.8))
physics2d.body_set_position(gövde, [x, y + 0.5])
physics2d.world_add_body(dünya, gövde)
// Baş-gövde revolute joint
let boyun = physics2d.revolute_joint_create(
baş, gövde,
[x, y + 1.2],
-0.5, 0.5 // Angle limits
)
physics2d.world_add_joint(dünya, boyun)
// Sol kol
let sol_kol = physics2d.body_create_dynamic(2.0)
physics2d.body_add_shape(sol_kol, physics2d.box_shape(0.15, 0.5))
physics2d.body_set_position(sol_kol, [x - 0.5, y + 0.5])
physics2d.world_add_body(dünya, sol_kol)
let sol_omuz = physics2d.revolute_joint_create(
gövde, sol_kol,
[x - 0.3, y + 0.7],
-1.57, 1.57 // ±90 derece
)
physics2d.world_add_joint(dünya, sol_omuz)
// Sağ kol (benzer şekilde)
// Sol bacak, sağ bacak...
return do
baş: baş,
gövde: gövde,
sol_kol: sol_kol
// ...
end
end
let dünya = physics2d.world_create([0.0, -9.81])
let ragdoll = ragdoll_create(dünya, 0.0, 5.0)
// Ragdoll'a darbe
physics2d.body_apply_impulse(ragdoll.baş, [5.0, 0.0], [0.0, 0.0])