2025-02-11 17:11:14 +08:00

68 lines
2.3 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class reflection : MonoBehaviour
{
public Camera _mainCamera;
public Camera _reflectionCamera;
RenderTexture _reflectionRenderTexture;
public Transform _planner;
private Material _palnnerMaterial;
// Start is called before the first frame update
void Start()
{
//拿到平面材质
_palnnerMaterial = _planner.GetComponent<MeshRenderer>().material;
//创建相机并指定相机渲染目标
_reflectionRenderTexture = new RenderTexture(Screen.width, Screen.height, 24);
_reflectionCamera.targetTexture = _reflectionRenderTexture;
_reflectionCamera.enabled = true;
//将相机渲染的目标赋给材质
_palnnerMaterial.SetTexture("_ReflectionTex",_reflectionRenderTexture);
}
// Update is called once per frame
void Update()
{
CalcReflectionCameraProperties();
}
void CalcReflectionCameraProperties()
{
Vector3 cameraPosWorldSpace = _mainCamera.transform.position;
Vector3 cameraForwardWorldSpace = _mainCamera.transform.forward;
Vector3 cameraUpDirWorldSpace = _mainCamera.transform.up;
//转换世界坐标系的点到平面的局部坐标系下
cameraPosWorldSpace.y *= -1.0f;
cameraForwardWorldSpace.y *= -1.0f;
//Vector3 cameraPosPlanarSpace = cameraPosWorldSpace; //_planner.InverseTransformPoint(cameraPosWorldSpace);
//Vector3 cameraForwardPlannarSpace = _planner.InverseTransformPoint(cameraForwardWorldSpace);
Vector3 cameraUpPlannarSpace=_planner.InverseTransformPoint(cameraUpDirWorldSpace);
//cameraPosPlanarSpace.y *= -1.0f;
//cameraForwardPlannarSpace.y *= -1.0f;
cameraUpPlannarSpace.y *= -1.0f;
//cameraPosWorldSpace = _planner.TransformPoint(cameraPosPlanarSpace);
//cameraForwardWorldSpace = _planner.TransformPoint(cameraForwardPlannarSpace);
cameraUpDirWorldSpace = _planner.TransformPoint(cameraUpPlannarSpace);
_reflectionCamera.transform.position = cameraPosWorldSpace;
_reflectionCamera.transform.LookAt(cameraPosWorldSpace+cameraForwardWorldSpace*0.1f,cameraUpDirWorldSpace);
}
private void OnDestroy()
{
}
}