added capsule collider

This commit is contained in:
=
2026-03-13 18:33:18 -04:00
parent 42bf990193
commit a5652fbe2d

View File

@@ -1,6 +1,7 @@
from dataclasses import dataclass
from typing import Generator
from abc import ABC, abstractmethod
from math import pi, cos, sin
import pygame as pg
from transform import Transform
@@ -89,4 +90,52 @@ class RectCollider(ConvexCollider):
])
def moment_of_inertia(self, mass: float) -> float:
return (1.0 / 12.0) * mass * (self.width ** 2 + self.height ** 2)
return (1.0 / 12.0) * mass * (self.width ** 2 + self.height ** 2)
@dataclass
class CapsuleCollider(ConvexCollider):
width: float
height: float
resolution: int = 8
@property
def radius(self) -> float:
return self.width / 2
@property
def _half_height(self) -> float:
return (self.height / 2) - self.radius
@dataclass
class CapsuleCollider(ConvexCollider):
width: float
height: float
resolution: int = 10
@property
def radius(self) -> float:
return self.width / 2
def hull(self, transform: Transform) -> PolygonalHull:
verts: list[pg.Vector2] = []
center_offset = (self.height / 2.0 - self.radius)
top_center = transform.global_position - pg.Vector2(0, center_offset).rotate(transform.global_degrees) * transform.global_scale
bottom_center = transform.global_position + pg.Vector2(0, center_offset).rotate(transform.global_degrees) * transform.global_scale
angle = pi
for _ in range(0, self.resolution):
verts.append(
top_center + (self.radius * pg.Vector2(cos(angle), -sin(angle))).rotate(transform.global_degrees) * transform.global_scale
)
angle -= pi / self.resolution
angle = 0.0
for _ in range(0, self.resolution):
verts.append(
bottom_center + (self.radius * pg.Vector2(cos(angle), -sin(angle))).rotate(transform.global_degrees) * transform.global_scale
)
angle -= pi / self.resolution
return PolygonalHull(verts)
def moment_of_inertia(self, mass: float) -> float:
return (1.0 / 12.0) * mass * (self.width ** 2 + self.height ** 2)