31 lines
1.4 KiB
C#
31 lines
1.4 KiB
C#
#if UNITY_EDITOR
|
|
using UnityEngine;
|
|
|
|
namespace O3DWB
|
|
{
|
|
public static class ObjectPositionCalculator
|
|
{
|
|
#region Public Static Functions
|
|
public static Vector3 CalculateObjectHierarchyPosition(Prefab sourcePrefab, Vector3 desiredOrientedBoxCenter, Vector3 desiredWorldScale, Quaternion desiredWorldRotation)
|
|
{
|
|
return CalculateObjectHierarchyPosition(sourcePrefab.UnityPrefab, desiredOrientedBoxCenter, desiredWorldScale, desiredWorldRotation);
|
|
}
|
|
|
|
public static Vector3 CalculateObjectHierarchyPosition(GameObject source, Vector3 desiredOrientedBoxCenter, Vector3 desiredWorldScale, Quaternion desiredWorldRotation)
|
|
{
|
|
OrientedBox prefabWorldOrientedBox = source.GetHierarchyWorldOrientedBox();
|
|
Transform rootTransform = source.transform;
|
|
|
|
Matrix4x4 rootTransformMatrix = Matrix4x4.TRS(Vector3.zero, rootTransform.rotation, rootTransform.lossyScale);
|
|
Matrix4x4 desiredTransformMatrix = Matrix4x4.TRS(Vector3.zero, desiredWorldRotation, desiredWorldScale);
|
|
Matrix4x4 inverseTransformMatrix = desiredTransformMatrix * rootTransformMatrix.inverse;
|
|
|
|
Vector3 relationshipVector = rootTransform.position - prefabWorldOrientedBox.Center;
|
|
relationshipVector = inverseTransformMatrix.MultiplyVector(relationshipVector);
|
|
|
|
return desiredOrientedBoxCenter + relationshipVector;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|
|
#endif |