public void UpdateTransform(Transform objectTransform, DoubleVector3 objectOriginECEF, Vector3 translationOffsetECEF, Quaternion orientationECEF, float heightOffset, bool applyFlattening) { var cameraRelativePosition = (objectOriginECEF - m_cameraPositionECEF).ToSingleVector(); cameraRelativePosition += m_up * heightOffset + translationOffsetECEF; if (applyFlattening && m_flattenScale != 1.0f) { var scaleVec = new Vector3(1, m_flattenScale, 1); var localToECEF = Quaternion.FromToRotation(Vector3.up, m_up); var ecefToLocal = Quaternion.FromToRotation(m_up, Vector3.up); var innerRotation = ecefToLocal * orientationECEF; TransformHelper.ApplyTransform(objectTransform, cameraRelativePosition, scaleVec, localToECEF, innerRotation); } else { TransformHelper.ApplyTransform(objectTransform, cameraRelativePosition, Vector3.one, orientationECEF, Quaternion.identity); } }
public void UpdateTransform(Transform objectTransform, DoubleVector3 objectOriginECEF, Vector3 translationOffsetECEF, Quaternion orientationECEF, float heightOffset, bool applyFlattening) { var finalPositionECEF = objectOriginECEF + translationOffsetECEF; var resourceUp = m_frame.ECEFToLocalRotation * objectOriginECEF.normalized.ToSingleVector(); var localPosition = m_frame.ECEFToLocalSpace(finalPositionECEF) + Vector3.up * heightOffset; var localRotation = m_frame.ECEFToLocalRotation * orientationECEF; if (applyFlattening && m_flattenScale != 1.0f) { var resourceToLocal = Quaternion.FromToRotation(resourceUp, Vector3.up); var localToResource = Quaternion.Inverse(resourceToLocal); var innerRotation = resourceToLocal * localRotation; var scaleVec = new Vector3(1, m_flattenScale, 1); TransformHelper.ApplyTransform(objectTransform, localPosition, scaleVec, localToResource, innerRotation); } else { TransformHelper.ApplyTransform(objectTransform, localPosition, Vector3.one, localRotation, Quaternion.identity); } }