Skip to main content
Version: Next

Custom PoseTracker 구현

VLSDK는 기본적으로 ARFoundation과 ARDataset를 지원하고 있습니다. 그러나 플랫폼에서 ARFoundation을 지원하지 않거나 ARDataset이 아닌 다른 방식으로 테스트를 하고 싶은 경우 사용자가 직접 PoseTracker를 생성해서 사용할 수 있습니다.

기본 구조

프로젝트 내의 원하는 공간에 ARCeye.PoseTracker를 상속받는 클래스를 하나 생성합니다. 생성한 클래스는 다음과 같은 형태를 가져야 합니다.

using ARCeye;

public class MyPoseTracker : PoseTracker
{
// (Optional)
public override void OnCreate(Config config)
{
// PoseTracker가 생성될 때 호출되는 이벤트. config에 접근하여 PoseTracker의 설정을 수정할 수 있다.
}

// (Required)
public override void RegisterFrameLoop()
{
// Loop Event를 등록하는 이벤트. VLSDKManager의 StartSession()이 호출되면 실행된다.
}

// (Required)
public override void UnregisterFrameLoop()
{
// Loop Event를 해제하는 이벤트. VLSDKManager의 StopSession()이 호출되면 실행된다.
}

// ARFrame을 생성하는 메서드. 구현하고자 하는 상황에 맞게 구현한다.
public ARFrame CreateARFrame()
{
ARFrame frame = new ARFrame();

/* ... */

return frame;
}
}

Loop Event

Loop Event는 매 프레임마다 실행이 되는 메서드로 Unity의 생명주기 이벤트인 Update() 이벤트와 유사하다고 볼 수 있습니다. Loop Event에서는 반드시 ARFrame 인스턴스를 이용하여 UpdateFrame(ARFrame) 메서드를 실행해야 합니다. AR 프레임워크에서 loop event가 제공이 된다면 다음과 같은 방법으로 등록할 수 있습니다.

AR 프레임워크에서 제공하는 loop event가 있는 경우
using ARCeye;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class MyPoseTracker : PoseTracker
{
// ex. ARFoundation의 경우.
private ARCameraManager m_CameraManager;

public override void OnCreate(Config config)
{
m_CameraManager = GameObject.FindObjectOfType<ARCameraManager>();
}

public override void RegisterFrameLoop()
{
m_CameraManager.frameReceived += OnCameraFrameReceived;
}

public override void UnregisterFrameLoop()
{
m_CameraManager.frameReceived -= OnCameraFrameReceived;
}

private void OnCameraFrameReceived(ARCameraFrameEventArgs eventArgs)
{
ARFrame frame = CreateARFrameWithArgs(eventArgs);

// !!! (필수) Loop Event의 마지막에 UpdateFrame 호출. !!!
UpdateFrame(frame);
}

public ARFrame CreateARFrameWithArgs(ARCameraFrameEventArgs eventArgs)
{
ARFrame frame = new ARFrame();

/* ...ARCameraFrameEventArgs을 이용해서 ARFrame 생성... */

return frame;
}
}

ARFoundation이나 ARDataset과 자동으로 실행되는 이벤트 루프가 없는 경우를 위해 Loop Event를 쉽게 등록하고 해제할 수 있도록 FrameLoopRunner 클래스를 제공합니다. 다음과 같은 방법으로 Loop Event를 등록하고 제거할 수 있습니다.

AR 프레임워크에서 제공하는 loop event가 없는 경우
using ARCeye;

public class MyPoseTracker : PoseTracker
{
public override void RegisterFrameLoop()
{
FrameLoopRunner.Instance?.StartFrameLoop(OnFrameUpdated);
}

public override void UnregisterFrameLoop()
{
FrameLoopRunner.Instance?.StopFrameLoop();
}

private void OnFrameUpdated()
{
ARFrame frame = CreateARFrame();

// !!! (필수) Loop Event의 마지막에 UpdateFrame 호출. !!!
UpdateFrame(frame);
}

public ARFrame CreateARFrame()
{
ARFrame frame = new ARFrame();

/* ... */

return frame;
}
}