81 lines
2.5 KiB
C#
81 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
|
|
public class PointManagerView : MonoBehaviour
|
|
{
|
|
[SerializeField] private GameObject pointPrefab;
|
|
private List<GameObject> activePoints = new List<GameObject>();
|
|
public Transform robotBaseTransform; // 로봇좌표의 기준이 되는 축 위치
|
|
|
|
[SerializeField] public GameObject movingAlert;
|
|
[SerializeField]
|
|
[Tooltip("반투명 로봇 모델의 IK")]
|
|
public HybridInverseKinematicsNode kinematicsNode;
|
|
|
|
void Start()
|
|
{
|
|
movingAlert.SetActive(false);
|
|
}
|
|
|
|
private Vector3 ConvertRobotDataToVector3(RobotData pose)
|
|
{
|
|
float x = Convert.ToSingle(pose.x / -1000.0); // mm -> m
|
|
float y = Convert.ToSingle(pose.z / 1000.0); // Robot Z(mm) -> Unity Y(m)
|
|
float z = Convert.ToSingle(pose.y / -1000.0); // Robot Y(mm) -> Unity Z(m)
|
|
return new Vector3(x, y, z);
|
|
}
|
|
|
|
public void CreatePoint(RobotData pose, int index)
|
|
{
|
|
Vector3 localPos = ConvertRobotDataToVector3(pose);
|
|
Vector3 worldPos = localPos;
|
|
|
|
// 로봇 Base가 있다면, 로컬 좌표를 월드 좌표로 변환
|
|
if (robotBaseTransform != null)
|
|
{
|
|
worldPos = robotBaseTransform.TransformPoint(localPos);
|
|
}
|
|
else
|
|
{
|
|
Debug.LogWarning("PointManagerView: RobotBaseTransform이 할당되지 않아 월드 원점 기준으로 생성됩니다.");
|
|
}
|
|
|
|
// 변환된 월드 좌표에 생성
|
|
GameObject pointObj = Instantiate(pointPrefab, worldPos, Quaternion.identity, this.transform);
|
|
activePoints.Add(pointObj);
|
|
|
|
RobotPoint pointComponent = pointObj.GetComponent<RobotPoint>();
|
|
if (pointComponent != null)
|
|
{
|
|
pointComponent.pointIndex = activePoints.Count - 1;
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("point프리팹에 RobotPoint스크립트가 없음");
|
|
}
|
|
}
|
|
|
|
public void UpdatePointPosition(int index, Vector3 pose)
|
|
{
|
|
if (index < 0 || index >= activePoints.Count) return;
|
|
activePoints[index].transform.position = pose;
|
|
}
|
|
|
|
public void DeletePoint(int index)
|
|
{
|
|
if (index < 0 || index >= activePoints.Count) return;
|
|
Destroy(activePoints[index]);
|
|
activePoints.RemoveAt(index);
|
|
}
|
|
|
|
public void RedrawPoints(List<RobotData> poses)
|
|
{
|
|
foreach (var point in activePoints) Destroy(point);
|
|
activePoints.Clear();
|
|
if (poses == null) return;
|
|
for (int i= 0; i < poses.Count; i++) CreatePoint(poses[i], i);
|
|
}
|
|
}
|