using System;
publicclassPlanarReflectionTest
{privatevoidStart(){
// hold planar material
_planaerMat = _planar.GetComponent<MeshRenderer>().material;
// Create render texture for reflection camera
_reflectionRenderTarget = new RenderTexture(Screen.width, Screen.height, depth:24);
_reflectionCamera.targetTexture = _reflectionRenderTarget;
_reflectionCamera.enabled = true;
// Bind material & render texture
_planarMat.SetTexture(Shader.PropertyToID("_ReflectionTex"), _reflectionRenderTarget);
}
privatevoidCalcReflectionCameraProperties(){
// camera properties in World Space 主相机,世界空间下,pos, forward,up
Vector3 cameraPosWorldSpace = _mainCamera.transform.position;
Vector3 cameraForwardWorldSpace = _mainCamera.transform.forward;
Vector3 cameraUpDirWorldSpace = _mainCamera.transform.up;
// Convert properties from world space to planar local space 转换为 平面物体的 local space下的 pos, forward, up
Vector3 cameraPosPlanarSpace = _planar.InverseTransformPoint(cameraPosWorldSpace);
Vector3 cameraForwardPlanarSpace = _planar.InverseTransformDirection(cameraForwardWorldSpace);
Vector3 cameraUpPlanarSpace = _planar.InverseTransformDirection(cameraUpDirWorldSpace);
// Reflect in Planar local space, revert in Y direction is OK// local space 下,法线是(0, 1, 0),所以只要做y方向取反,得到对称后的pos,forward,up
cameraPosPlanarSpace.y *= -1.0f;
cameraForwardPlanarSpace.y *= -1.0f;
cameraUpPlanarSpace.y *= -1.0f;
// Convert properties back to world space from planar's local space// 把对称后的 平面物体 local space下的 pos,forward, up 转换回 world space 下
cameraPosWorldSpace = _planar.TransformPoint(cameraPosPlanarSpace);
cameraForwardWorldSpace = _planar.TransformDirection(cameraForwardPlanarSpace);
cameraUpDirWorldSpace = _planar.Transformdirection(cameraUpPlanarSpace);
// Apply properties to reflection camera// 把映射回 world space 的Pos,forward,up 应用给 reflection camera
_reflectionCamera.transform.position = cameraPosWorldSpace;
_reflectionCamera.transform.LookAt(cameraPosWorldSpace + cameraForwardWorldSpace, cameraUpDirWorldSpace);
}
}