[Unity Editor] Recognizer #1 - $1 Unistroke Recognizer

qweasfjbv·2025년 2월 24일
0

UnityEditor

목록 보기
7/11

개요


Unity에서 간단하게 Unistroke Recognizer를 구현해보겠습니다.
그 후에는 Unity Editor를 사용해서 편집이 가능하도록 수정해보겠습니다.

구현


$1 Unistroke Recognizer는 한붓그리기로 그린 모양을 통해 가장 비슷한 Gesture를 찾아내는 알고리즘입니다.
자세한 내용은 해당 논문을 참고하시기 바랍니다.
( 수도코드는 맨 뒤쪽 Appendix에, 설명은 중앙의 A Simple Four-Step Algorithm 부터 읽으시면 됩니다. )

항상 동일한 환경에서 비교를 하기 위해서 다음과 같은 과정이 필요합니다.

Resample

To make gesture paths directly comparable even at different movement speeds, we first resample gestures such that the path defined by their original M points is defined by N equidistantly spaced points

매번 그릴때마다 그리는 속도가 달라질 수 있고, 그리는 속도가 달라지면 매 프레임 찍히는 점의 위치가 달라집니다.
해당 점들의 위치는 유사도를 측정할때 중요하게 사용되므로 점의 개수를 같게하고, 경로의 길이와 선형보간을 통해 모든 점들을 동일한 간격으로 배치합니다.

Rotate with Indicative Angle

First, we find a gesture’s indicative angle, which we define as the angle formed between the centroid of the gesture (x¯,y¯) and the gesture’s first point.

동일하게 비교하기 위해서 Rotate도 신경써야 합니다. 해당 논문에서는 동일한 회전을 찾기 위해서 Indicative Angle 이라는 방법을 사용했습니다.
Indicative Angle은 점들의 중심점에서 시작점으로의 방향벡터를 항상 0도로 설정하는 방식입니다.

보시는 것처럼 항상 저 방향이 0도에 가도록 회전시키면 동일한 환경에서 제스쳐를 인식할 수 있습니다.

Scale and Translate

이제 크기와 위치를 조정해야합니다.
우선 모든 점을 포함하는 최소한의 사각형을 구한 뒤에, 해당 사각형의 한 모서리를 기준으로 Scale을 조정합니다.

기준을 잡으면 좌표차를 사용해서 Translate을 할 수 있고, 기준점이 사각형의 모서리라면 (size/rect.width) 를 곱해서 width와 height 가 size 인 사각형 안으로 Scale을 정규화 할 수 있습니다.


수도코드를 따라 만들고 간단하게 시각화한 결과입니다.

마무리


Roll같이 시작과 끝이 애매한 제스쳐의 경우에는 생각보다 잘 찾지 못하는 것을 확인하실 수 있습니다.
게임에 사용하려면 시작점과 시작점에서부터의 방향까지 고려를 해야할 것 같습니다.
하나의 기호에 여러 제스쳐를 포함해서 어떻게 그려도 인식이 되도록 해야할 것 같습니다.

참고자료


https://faculty.washington.edu/wobbrock/pubs/uist-07.01.pdf

0개의 댓글