94 lines
3.1 KiB
C#
94 lines
3.1 KiB
C#
using System;
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
/// <summary>
|
|
/// Implements live tracking of streamed OptiTrack rigid body data onto an object using Rigid Body Name instead of ID,
|
|
/// and periodically rechecks the ID.
|
|
/// </summary>
|
|
public class OptitrackRigidBody : MonoBehaviour
|
|
{
|
|
[Tooltip("The object containing the OptiTrackStreamingClient script.")]
|
|
public OptitrackStreamingClient StreamingClient;
|
|
|
|
[Tooltip("The name of the rigid body in Motive.")]
|
|
public string RigidBodyName;
|
|
|
|
private float updateInterval = 0.1f;
|
|
|
|
private int RigidBodyId = -1;
|
|
private string lastCheckedName; // 마지막으로 확인한 이름을 저장
|
|
|
|
[HideInInspector]
|
|
public bool isRigidBodyFound = false;
|
|
|
|
void Start()
|
|
{
|
|
// StreamingClient를 찾습니다.
|
|
if (this.StreamingClient == null)
|
|
{
|
|
this.StreamingClient = OptitrackStreamingClient.FindDefaultClient();
|
|
|
|
if (this.StreamingClient == null)
|
|
{
|
|
Debug.LogError(GetType().FullName + ": Streaming client not set, and no " + typeof(OptitrackStreamingClient).FullName + " components found in scene; disabling this component.", this);
|
|
this.enabled = false;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 주기적으로 RigidBody를 찾는 코루틴 시작
|
|
StartCoroutine(CheckRigidBodyIdPeriodically());
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
UpdatePose();
|
|
}
|
|
|
|
void UpdatePose()
|
|
{
|
|
if (!isRigidBodyFound) return;
|
|
|
|
OptitrackRigidBodyState rbState = StreamingClient.GetLatestRigidBodyState(RigidBodyId);
|
|
if (rbState != null)
|
|
{
|
|
this.transform.localPosition = rbState.Pose.Position;
|
|
this.transform.localRotation = rbState.Pose.Orientation;
|
|
}
|
|
}
|
|
|
|
private IEnumerator CheckRigidBodyIdPeriodically()
|
|
{
|
|
while (true)
|
|
{
|
|
// 현재 이름이 마지막으로 확인한 이름과 다르거나, RigidBody를 찾지 못한 상태라면 검색 수행
|
|
if (lastCheckedName != RigidBodyName || !isRigidBodyFound)
|
|
{
|
|
int newRigidBodyId = StreamingClient.GetRigidBodyIdByName(RigidBodyName);
|
|
|
|
if (newRigidBodyId != -1)
|
|
{
|
|
if (newRigidBodyId != RigidBodyId)
|
|
{
|
|
// 새로운 RigidBody 발견
|
|
RigidBodyId = newRigidBodyId;
|
|
this.StreamingClient.RegisterRigidBody(this, RigidBodyId);
|
|
Debug.Log($"RigidBody 재연결 성공: {RigidBodyName} (ID: {RigidBodyId})");
|
|
}
|
|
isRigidBodyFound = true;
|
|
lastCheckedName = RigidBodyName;
|
|
}
|
|
else
|
|
{
|
|
// RigidBody를 찾지 못함
|
|
isRigidBodyFound = false;
|
|
//Debug.LogWarning($"RigidBody를 찾을 수 없음: {RigidBodyName}");
|
|
}
|
|
}
|
|
|
|
yield return new WaitForSeconds(updateInterval);
|
|
}
|
|
}
|
|
}
|