Rendering Spec · Rev. 2026

Sweep Scanner

두 개의 segment 사이를 sweep 하면서 Pawn 객체를 검출하는 스캐닝 시스템. raycast / physics query 없이 analytic overlap test만으로 판정합니다.

근접 공격 판정 AI 스캔 Interaction Scan Sweep Detection Deterministic Raycast Physics Query Triangle Mesh Voxel Traversal
3Shape Support
0Physics Calls
100%Deterministic
scroll
01
개요
Overview

Sweep Scanner는 월드 공간에서 두 개의 segment 사이를 sweep 하면서 Pawn 객체를 검출하는 스캐닝 시스템이다.

이 시스템은 raycast, physics query, mesh collision을 사용하지 않고 analytic overlap test만으로 Pawn을 판정한다.

사용 목적
근접 공격 판정 AI 스캔 Interaction Scan Volume Detection Deterministic Gameplay Scan
지원 Pawn Shape
Sphere Cube (OBB) Capsule
비목표 (Non-goal)
Triangle Mesh Collision Raycast Physics Engine Query Voxel Traversal Camera Space Scan
02
기본 개념
Core Concept

하나의 segment가 출발 위치(segmentA)에서 도착 위치(segmentB)로 이동하면서, 경로상의 임의 시점 t에서 Pawn과 교차하는지 검사한다.

입력 Segment
// segmentA (출발)
a0  a1
// segmentB (도착)
b0  b1
Sweep Motion
a0 ·····→ b0
|          |
a1 ·····→ b1
// segment가 이동하는 궤적
이동하는 segment가 쓸고 지나간 면 궤적(swept surface)이 스캐닝 영역이 된다. 볼륨이 아닌 2D 궤적 면이다.
03
좌표계
Space Definition

모든 계산은 world space 기준으로 수행한다.

사용하지 않는 좌표계
View Space Camera Space Ray Space Physics Space
입력 정의
float3 a0
float3 a1
float3 b0
float3 b1
Sweep Motion
// S(t) = lerp(segmentA, segmentB, t)
S(t).p0 = lerp(a0, b0, t)
S(t).p1 = lerp(a1, b1, t)

t  [0, 1]
04
Sweep 정의
Sweep Definition

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
Sweep에는 두께(thickness) 개념이 없다. 교차 판정은 이동 중인 segment와 Pawn shape 사이의 거리로 수행한다.
05
Sweep 특성
Swept Surface Properties

이동하는 segment가 그리는 궤적은 ruled surface(선직면)이다. 두 segment가 평행할 필요 없으며, AABB가 아니다.

Ruled Surface 임의 방향 sweep 두께(thickness) 없음 Axis-aligned 아님
06
Pawn 모델
Target Model

Sweep Scanner는 Pawn primitive만 검사한다.

Pawn 구조
struct Pawn
{
    float3     position
    quaternion rotation
    float3     extents
    ShapeType  shape
}
ShapeType
Sphere   // float3 + radius
Cube     // OBB로 처리
Capsule  // segment + radius
07
Overlap 테스트 방식
Overlap Test Strategy
필요한 테스트
Sweep vs Sphere Sweep vs Cube (OBB) Sweep vs Capsule
권장 방식 — Sweep Local Space 변환
pawnLocal = inverse(sweepTransform) * pawn
// → canonical segment sweep vs shape test
08
Sweep Local Space
Local Coordinate Frame

Sweep 기준 좌표계를 구성하고, Pawn을 이 공간으로 변환한다.

축 정의
X = segment direction
Y = sweep direction
Z = normal
예시 계산
xAxis = normalize(a1 - a0)
yAxis = normalize(b0 - a0)
zAxis = cross(xAxis, yAxis)
이 공간에서 segment sweep은 정규화된 형태로 단순화되어 테스트가 쉬워진다.
09
Sphere 테스트
Sweep vs Sphere
// 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
10
Cube 테스트 (OBB)
Sweep vs Cube

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
11
Capsule 테스트
Sweep vs Capsule
Capsule 정의
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
12
비평행 Segment
Non-parallel Segments

segmentA와 segmentB는 평행하지 않아도 된다. 임의의 방향과 길이를 가질 수 있다.

비평행인 경우 swept surface는 평면이 아닌 bilinear patch가 된다. local space 변환 시 이 비선형성을 고려해야 한다.

Non-parallel 허용 임의 방향 허용 임의 길이 허용 두 segment 동시에 zero-length 불가
13
성능 모델
Performance Model
기본 복잡도
O(sweep × pawn)
Chunk 최적화
O(chunk × pawn)
Ray 방식 대비 장점
Branch 적음 SIMD 가능 Job Friendly Deterministic
14
확장 가능성
Future Extensions
가능한 사용
  • Weapon Sweep
  • AI Sensing
  • Interaction Scan
  • Damage Volume
  • Continuous Sweep
Shape 확장
  • Cone Sweep
  • Cylinder Sweep
  • Time Sweep