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