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 dataclasses import dataclass
from typing import Generator from typing import Generator
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from math import pi, cos, sin
import pygame as pg import pygame as pg
from transform import Transform from transform import Transform
@@ -89,4 +90,52 @@ class RectCollider(ConvexCollider):
]) ])
def moment_of_inertia(self, mass: float) -> float: 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)