added capsule collider
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user