/// <summary> /// <para xml:lang="en">Calculate and set the transform <paramref name="t"/> of one object using <paramref name="pose"/> and the other object's transform <paramref name="centerT"/>, to express the relation of the two objects in 3D space which is known in <paramref name="pose"/>.</para> /// <para xml:lang="zh">已知两个物体的的相对关系,通过<paramref name="pose"/>以及一个物体的transform <paramref name="centerT"/>计算并设置另一个物体的transform <paramref name="t"/>,以便在三维空间中将这个关系表达出来。</para> /// </summary> public static void SetPoseOnTransform(Transform t, Transform centerT, Matrix44F pose, Matrix4x4 displayCompensation, bool isCamera, bool onCamera, bool manualHorizontalFlip = false) { Matrix4x4 translateMatrix = Matrix4x4.identity; translateMatrix.m22 = -1; var translateTransform = translateMatrix * Matrix4x4.TRS(centerT.position, centerT.rotation, Vector3.one) * translateMatrix; var willSetPose = pose.ToUnityMatrix(); if (onCamera) { Matrix4x4 cameraTransform; if (isCamera) { cameraTransform = willSetPose; } else { cameraTransform = willSetPose.inverse; } willSetPose = cameraTransform * displayCompensation.inverse; } else { Matrix4x4 targetTransform; if (isCamera) { targetTransform = willSetPose.inverse; } else { targetTransform = willSetPose; } willSetPose = displayCompensation * targetTransform; } if (manualHorizontalFlip) { Matrix4x4 hFlipTranslateMatrix = Matrix4x4.identity; hFlipTranslateMatrix.m00 = -1; willSetPose = hFlipTranslateMatrix * willSetPose * hFlipTranslateMatrix; } willSetPose = translateTransform * willSetPose; SetMatrixOnTransform(t, willSetPose, true); }