ObjectPositionCalculator.cs 1.4 KB

12345678910111213141516171819202122232425262728293031
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. namespace O3DWB
  4. {
  5. public static class ObjectPositionCalculator
  6. {
  7. #region Public Static Functions
  8. public static Vector3 CalculateObjectHierarchyPosition(Prefab sourcePrefab, Vector3 desiredOrientedBoxCenter, Vector3 desiredWorldScale, Quaternion desiredWorldRotation)
  9. {
  10. return CalculateObjectHierarchyPosition(sourcePrefab.UnityPrefab, desiredOrientedBoxCenter, desiredWorldScale, desiredWorldRotation);
  11. }
  12. public static Vector3 CalculateObjectHierarchyPosition(GameObject source, Vector3 desiredOrientedBoxCenter, Vector3 desiredWorldScale, Quaternion desiredWorldRotation)
  13. {
  14. OrientedBox prefabWorldOrientedBox = source.GetHierarchyWorldOrientedBox();
  15. Transform rootTransform = source.transform;
  16. Matrix4x4 rootTransformMatrix = Matrix4x4.TRS(Vector3.zero, rootTransform.rotation, rootTransform.lossyScale);
  17. Matrix4x4 desiredTransformMatrix = Matrix4x4.TRS(Vector3.zero, desiredWorldRotation, desiredWorldScale);
  18. Matrix4x4 inverseTransformMatrix = desiredTransformMatrix * rootTransformMatrix.inverse;
  19. Vector3 relationshipVector = rootTransform.position - prefabWorldOrientedBox.Center;
  20. relationshipVector = inverseTransformMatrix.MultiplyVector(relationshipVector);
  21. return desiredOrientedBoxCenter + relationshipVector;
  22. }
  23. #endregion
  24. }
  25. }
  26. #endif