/// <summary> /// Returns position and rotation offsets from viewpoint to camera /// </summary> public void CalculateOffsets(VRC_AvatarDescriptor desc, Camera cam) { if (!desc || !cam) { return; } SerialTransform offsets = GetOffsetsFromViewpoint(desc, cam); if (offsets) { offsetMode = CameraOffsetMode.Viewpoint; positionOffset = offsets.localPosition; rotationAnglesOffset = offsets.localEulerAngles; } }
/// <summary> /// Returns position and rotation offsets from target transform to camera /// </summary> public void CalculateOffsets(Transform target, Camera cam) { if (!target || !cam) { return; } if (target == target.root) { offsetMode = CameraOffsetMode.AvatarRoot; } else { offsetMode = CameraOffsetMode.Transform; } Transform dummy = null; try { dummy = new GameObject("Dummy").transform; dummy.position = target.position; dummy.rotation = target.rotation; Transform oldParent = cam.transform.parent; cam.transform.parent = dummy; positionOffset = cam.transform.localPosition; rotationAnglesOffset = cam.transform.localEulerAngles; transformPath = Helpers.GetGameObjectPath(target); cam.transform.parent = oldParent; } finally { if (dummy) { Helpers.DestroyAppropriate(dummy.gameObject); } } }