Sweep Scanner는 월드 공간에서 두 개의 segment 사이를 sweep 하면서
Pawn 객체를 검출하는 스캐닝 시스템이다.
이 시스템은 raycast, physics query, mesh collision을 사용하지 않고 analytic overlap test만으로 Pawn을 판정한다.
하나의 segment가 출발 위치(segmentA)에서 도착 위치(segmentB)로
이동하면서, 경로상의 임의 시점 t에서 Pawn과 교차하는지 검사한다.
// segmentA (출발) a0 → a1 // segmentB (도착) b0 → b1
a0 ·····→ b0 | | a1 ·····→ b1 // segment가 이동하는 궤적
모든 계산은 world space 기준으로 수행한다.
float3 a0 float3 a1 float3 b0 float3 b1
// S(t) = lerp(segmentA, segmentB, t) S(t).p0 = lerp(a0, b0, t) S(t).p1 = lerp(a1, b1, t) t ∈ [0, 1]
Sweep은 segment가 다른 segment로 이동하는 운동으로 정의된다. 파라미터 t는 이동 진행도를 나타낸다.
// t=0 → segmentA, t=1 → segmentB S(t) = lerp(segmentA, segmentB, t) S(t).p0 = lerp(a0, b0, t) S(t).p1 = lerp(a1, b1, t) t ∈ [0, 1]
// 임의 t에서 segment(t)가 // Pawn shape와 교차하면 hit for t ∈ [0, 1]: if intersects(S(t), pawn): return hit
이동하는 segment가 그리는 궤적은 ruled surface(선직면)이다. 두 segment가 평행할 필요 없으며, AABB가 아니다.
Sweep Scanner는 Pawn primitive만 검사한다.
struct Pawn { float3 position quaternion rotation float3 extents ShapeType shape }
Sphere // float3 + radius Cube // OBB로 처리 Capsule // segment + radius
pawnLocal = inverse(sweepTransform) * pawn // → canonical segment sweep vs shape test
Sweep 기준 좌표계를 구성하고, Pawn을 이 공간으로 변환한다.
X = segment direction Y = sweep direction Z = normal
xAxis = normalize(a1 - a0) yAxis = normalize(b0 - a0) zAxis = cross(xAxis, yAxis)
// sphere center를 segmentA, segmentB 각각에 투영 dA = dist_point_to_segment(sphere.center, a0, a1) dB = dist_point_to_segment(sphere.center, b0, b1) hit = min(dA, dB) <= sphere.radius
Cube는 OBB로 처리한다. swept surface 전체(bilinear patch)와 OBB의 교차를 검사해야 한다.
// quad (a0,a1,b1,b0)를 삼각형 2개로 분해 후 OBB 교차 tri0 = (a0, a1, b0) tri1 = (a1, b1, b0) hit = triangle_obb(tri0, obb) || triangle_obb(tri1, obb) // 또는 4개 꼭짓점 + 4개 엣지 기반 SAT
p0 // segment start p1 // segment end radius
// swept surface와 capsule segment 사이 최소 거리 // = patch edge/interior vs capsule seg 최근접 d = seg_patch_dist(capsule.seg, a0, a1, b0, b1) hit = d <= capsule.radius
segmentA와 segmentB는 평행하지 않아도 된다. 임의의 방향과 길이를 가질 수 있다.
비평행인 경우 swept surface는 평면이 아닌 bilinear patch가 된다. local space 변환 시 이 비선형성을 고려해야 한다.
O(sweep × pawn)
O(chunk × pawn)
- Weapon Sweep
- AI Sensing
- Interaction Scan
- Damage Volume
- Continuous Sweep
- Cone Sweep
- Cylinder Sweep
- Time Sweep