How to prevent third person camera from clipping through objects and terrain

I am trying to create a third person camera script. I have it to where it works exactly how I want it to, except that it clips through terrain. How can I modify my script to smoothly move the camera forward along the ground towards the character and smoothly zoom back out when moving the camera away from the ground?

This is what I have so far:

    public GameObject character;
    public float minCameraDistance = 2.0f;
    public float maxCameraDistance = 20.0f;
    public float maxCameraAngle = 160.0f;
    public float minCameraAngle = -160.0f;
    public float cameraVerticalOffset = 0;
    private Vector3 cameraOrigin;
    private float cameraDistance = 5.0f;
    private float currentX = 0.0f;
    private float currentY = 0.0f;
    void Update()
    {
        // Target the camera to a position above the character
        cameraOrigin = character.transform.position + new Vector3(0, cameraVerticalOffset, 0);

        currentX += Input.GetAxis("Mouse X");
        currentY += Input.GetAxis("Mouse Y");

        currentY = Mathf.Clamp(currentY, minCameraAngle, maxCameraAngle);
    }
	void LateUpdate()
    {
        // Change the camera distance with the scroll wheel
        cameraDistance = cameraDistance - Input.GetAxis("Mouse ScrollWheel") * 5;
        cameraDistance = Mathf.Clamp(cameraDistance, minCameraDistance, maxCameraDistance);

        // Make the camera follow the character at a position behind and slightly above it
        Vector3 cameraPosition = new Vector3(0, (cameraDistance / 4), -cameraDistance);
        Quaternion rotation = Quaternion.Euler(-currentY, currentX, 0);
        this.transform.position = cameraOrigin + rotation * cameraPosition;
        this.transform.LookAt(cameraOrigin);
	}

Good day @xKriostar !

A solution could be to Raycast downwards from the camera to detect the terrain mesh collider.

Using the distance parameter, think of a max and minimum distance form the terrain you consider acceptable, and make a loop to:

If the raycast detects the distance < than the heigh desired, move the camera upwards and calculate the distance again until the distance is acceptable again. Do the same if the distance is > than desired, moving camera downwards.

If helped, mark the answer as good :smiley: