ARKit + RealityKit 기반 골프 퍼팅 레인지파인더 iOS 앱. 카메라로 볼→홀 사이 지형을 스캔해 법선벡터 필드를 수집하고, 실제 구름 물리 시뮬레이션으로 "어느 방향, 어느 세기로 쳐야 들어가는지"를 계산해 AR 화면 위에 보여준다. (2026-07-28 기준)

1. 측정 파이프라인

EasyPutt의 측정은 세 단계로 이루어진다. 사용자가 + 버튼을 눌러 화면 중앙 리티클이 가리키는 지점을 볼 위치로 캡처하면 지형 스캔이 시작된다. 이후 볼과 홀 사이를 카메라로 훑는 동안, 화면 중앙의 3×3 격자(핀치로 칸 크기 조절)가 가리키는 지점들의 좌표와 법선벡터가 계속 수집된다. + 버튼을 다시 누르면 그 지점이 홀 위치로 캡처되고, 수집된 지형 데이터 위에서 레인지파인더 계산이 실행된다.

핵심은 지형을 하나의 평면으로 근사하지 않는다는 점이다. 그린을 단일 평면(또는 소수의 평면)으로 피팅하면 국소적인 굴곡이 평균 속에 뭉개지기 쉽다. EasyPutt은 수백 개(현장 테스트 기준 100~330개)의 (좌표, 법선) 원시 샘플을 그대로 저장해 두고, 시뮬레이션 중 매 스텝마다 공의 현재 위치에서 수평 거리 기준 최근접 샘플의 법선을 꺼내 쓴다.

2. 지형 표현 — 법선벡터 샘플 필드

법선벡터는 격자 꼭짓점 좌표 16개에서 삼각형 외적으로 직접 계산한다(정밀 모드). ARKit이 주는 히트 법선을 그대로 수집하는 모드는 대조군으로 남겨 두어, 두 방식을 현장에서 비교할 수 있다.

각 샘플에는 퍼팅 라인(볼→홀 직선)으로부터의 수직 거리인 라인이탈 값이 붙는다. 이 값 덕분에 "라인 바로 위의 지형"과 "라인에서 0.5m 이상 떨어진 주변 지형"을 구분할 수 있고, 진단 화면에서 어떤 샘플이 실제 계산에 대표성이 있는지 판별하는 근거가 된다. 현장 테스트에서는 tilt 최대 ~15°의 급경사 샘플까지 안정적으로 수집됨을 확인했다.

AR 화면의 파란 화살표는 각 샘플 법선의 수평(x,z) 사영, 즉 fall line(물이 흐르는 내리막 방향)이고, 길이가 sin(기울기)에 비례한다. 평평하면 짧고 기울수록 길어지므로, 계산 결과를 보기 전에 지형 읽기 자체를 눈으로 검증할 수 있다. 노란 사각형은 샘플 위치 표시이며, 굴곡에 마커가 가려지지 않도록 전체 샘플 중 최고 높이 평면에 띄워 그린다.

3. 물리 모델

공은 반지름 0.021m, 질량 0.045kg의 실제 골프공 스펙으로 모델링되고, 매 시뮬레이션 스텝에 두 가지 힘이 작용한다.

경사 가속도는 중력을 그 지점 법선에 수직인 경사면 방향으로 투영한 성분에서 나온다. 균일한 구가 미끄러짐 없이 구를 때의 관성 계수 5/7을 곱해, 경사가 속도의 방향과 크기를 모두 바꾼다.

구름저항은 스팀프미터 실측값에서 환산된다: rollingResistance = releaseSpeed² / (2 × stimpReading). 물리적 마찰계수라기보다 "이 그린에서 관측되는 감속 정도"를 캘리브레이션한 값이라, 사용자가 설정에서 스팀프 값을 바꾸면 그린 스피드가 즉시 반영된다.

홀인 판정 반경(captureRadius)은 홀 반경 5.4cm 그 자체다 — 공의 무게중심이 홀 반경 안(허공 위)으로 들어오는 순간 지지를 잃고 떨어진다는 물리에 근거한다. 빠른 공이 좁은 반경을 한 스텝에 지나쳐 버리지 않도록, 판정은 스텝 끝점이 아니라 직전~다음 위치를 잇는 선분과 목표점 사이의 최소 거리로 한다.

4. 두 개의 독립 솔버

계산은 서로 독립된 두 방식으로 동시에 수행되어 교차 검증된다.

백+포워드 솔버는 홀에서 볼 쪽으로 거슬러 올라가는 역시간 백워드 추적으로 초기 후보를 구한 뒤, 그 후보를 볼에서 정방향으로 다시 시뮬레이션해 홀과의 오차를 반복 보정한다(verify/correct). 좌우 조준 여유 범위도 forward 시뮬레이션으로 직접 검증한다.

백워드 전용 솔버는 forward 반복 보정 없이, 홀에서부터 여러 각도로 백워드 추적을 반복하며 이분탐색으로 볼 위치에 도달하는 각도를 직접 찾고, 마지막에 한 번만 forward로 홀인 여부를 확인한다. 2~3배 빠른 대신 근사치다. 현장 테스트에서 평지~완경사에서는 두 솔버가 0.5m 지점 기준 0.2~4cm 이내로 일치했고, 경사가 커지면 20~30% 벌어지며, 급경사 내리막에서는 발산 사례가 확인되어 sanity 게이트가 남은 과제다.

역방향 적분(dt<0)은 정방향 스텝의 서브스텝 순서를 정확히 뒤집는 방식으로 구현해 역연산 가능성을 보장하고, 정방향은 position += v·dt + 0.5·a·dt²의 더 정밀한 운동학 공식을 쓴다 — 백워드가 만든 후보는 항상 forward로 독립 재검증되므로 두 적분이 서로의 정확한 역연산일 필요가 없어졌기 때문이다.

5. 결과 표기 규약

Boundary A / B는 "이 안으로 조준하면 들어간다"는 좌우 조준 여유 창의 양 끝이다. 수렴된 중심해 주변의 창 경계는 재시뮬레이션 대신 소각 근사(atan)를 중심해 방향 벡터에 적용해 구한다 — 홀인 판정 허용 오차(5.4cm)가 이미 보수적이므로 반복 계산은 낭비이기 때문이다.