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;
}
}