오브젝트를 회전시킬 때, 기본적으로는 그 오브젝트의 피벗(pivot)을 중심으로 회전합니다. 그러나 때로는 오브젝트의 피벗이 아닌 중심을 기준으로 회전해야 하는 경우가 있습니다. 이런 경우를 위한 기능을 구현하고 정리하였습니다.

 

📺 미리보기

 

 

이상한 위치에 있는 피벗
새롭게 생성된 피벗 오브젝트

 

📖 구현 내용

  • public static 함수를 이용하여 특정한 컴포넌트 및 import 없이 매우 편리하게 함수를 호출하여 사용합니다.
  • 대상 오브젝트가 여러 하이어라키로 구성되어있어도 문제 없이 중심값을 찾을 수 있습니다.
  • 함수를 호출하면 중심축이 자동으로 구성되고 해당 오브젝트가 리턴되어 바로 사용할 수 있습니다.

 

⚒️ 구현

· GetPivotCenter()

/// <summary>
/// 해당 오브젝트의 중심축 찾고 중심축 오브젝트 리턴
/// </summary>
/// <param name="targetGo">생성된 중심축 오브젝트</param>
/// <returns></returns>
public static GameObject GetPivotCenter(GameObject targetGo)
{
    Vector3 center = Vector3.zero;
    int count = 0;

    // 자식 오브젝트들의 MeshFilter 컴포넌트 검사
    foreach (MeshFilter mf in targetGo.GetComponentsInChildren<MeshFilter>())
    {
        // 메쉬 정보를 가져와서 메쉬의 중심점 계산
        Vector3 meshCenter = mf.mesh.bounds.center;

        // 로컬 좌표계 상의 중심점을 전역 좌표계 상의 좌표로 변환
        meshCenter = mf.transform.TransformPoint(meshCenter);

        // 중심점 누적값 계산
        center += meshCenter;
        ++count;
    }

    if (count > 0)
    {
        // 자식 오브젝트들의 중심점 평균값 반환
        center /= count;
    }

    // 피벗 중심의 위치에 회전을 위한 부모 오브젝트 생성
    GameObject rotateAxis = new GameObject($"Rotate Axis for {targetGo.name}");
    rotateAxis.transform.position = center;

    // 회전 축을 부모로 지정
    targetGo.transform.SetParent(rotateAxis.transform);

    // 회전축 오브젝트를 리턴
    return rotateAxis;
}

 

foreach (MeshFilter mf in targetGo.GetComponentsInChildren<MeshFilter>())
  • 오브젝트에서 활성화된 하위 MeshFilter을 모두 찾습니다.

 

// 중심점 누적값 계산
center += meshCenter;
  • 중심점을 모두 더합니다.

 

if (count > 0)
{
    // 자식 오브젝트들의 중심점 평균값 반환
    center /= count;
}
  • count(MeshFilter의 개수)만큼 나누어 중심값을 획득합니다.

 

// 피벗 중심의 위치에 회전을 위한 부모 오브젝트 생성
GameObject rotateAxis = new GameObject($"Rotate Axis for {targetGo.name}");
rotateAxis.transform.position = center;
  • 피벗 중심축을 대체할 새로운 오브젝트르 생성합니다
  • 오브젝트의 위치는 직전에 구한 위치(중심점)로 합니다.

 

// 회전 축을 부모로 지정
targetGo.transform.SetParent(rotateAxis.transform);
  • 대상 오브젝트의 부모를 생성한 회전 중심축으로 설정합니다.

 

 

✅ 사용

· 함수 호출

mObject = Utility.GetPivotCenter(targetItem);
  • 특정 오브젝트를 인자로 함수를 호출하면 인자로 넣은 오브젝트의 중심을 기준으로 새롭게 생성된 회전축 오브젝트가 리턴됩니다.

 

 

bonnate