I
I
Ivan Spasov2021-11-04 14:33:23
Unity
Ivan Spasov, 2021-11-04 14:33:23

How to find out the level of illumination of an object?

There is a solar panel, how to find out if light hits it?

I thought something like:

  1. Divide the panel into segments
  2. We start a beam from each segment towards the light source (the sun)
  3. If the beam did not crash with some other collider, then the segment is well lit
  4. Based on the number of illuminated segments, we can find out the% illumination


But it looks a little "on the forehead" and clumsy, how is this usually done?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
C
combine1, 2021-11-09
@spasiboivanu

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LightDetection : MonoBehaviour
{
    [Header("Settings")]
    [Tooltip("The camera who scans for light.")]
    public Camera m_camLightScan;
    [Tooltip("Show the light value in the log.")]
    public bool m_bLogLightValue = false;
    [Tooltip("Time between light value updates (default = 0.1f).")]
    public float m_fUpdateTime = 0.1f;

    public static float s_fLightValue;

    private const int c_iTextureSize = 1;

    private Texture2D m_texLight;
    private RenderTexture m_texTemp;
    private Rect m_rectLight;
    private Color m_LightPixel;

    private void Start()
    {
        StartLightDetection();
    }

    /// <summary>
    /// Prepare all needed variables and start the light detection coroutine.
    /// </summary>
    private void StartLightDetection()
    {
        m_texLight = new Texture2D(c_iTextureSize, c_iTextureSize, TextureFormat.RGB24, false);
        m_texTemp = new RenderTexture(c_iTextureSize, c_iTextureSize, 24);
        m_rectLight = new Rect(0f, 0f, c_iTextureSize, c_iTextureSize);

        StartCoroutine(LightDetectionUpdate(m_fUpdateTime));
    }

    /// <summary>
    /// Updates the light value each x seconds.
    /// </summary>
    /// <param name="_fUpdateTime">Time in seconds between updates.</param>
    /// <returns></returns>
    private IEnumerator LightDetectionUpdate(float _fUpdateTime)
    {
        while (true)
        {
            //Set the target texture of the cam.
            m_camLightScan.targetTexture = m_texTemp;
            //Render into the set target texture.
            m_camLightScan.Render();

            //Set the target texture as the active rendered texture.
            RenderTexture.active = m_texTemp;
            //Read the active rendered texture.
            m_texLight.ReadPixels(m_rectLight, 0, 0);

            //Reset the active rendered texture.
            RenderTexture.active = null;
            //Reset the target texture of the cam.
            m_camLightScan.targetTexture = null;

            //Read the pixel in middle of the texture.
            m_LightPixel = m_texLight.GetPixel(c_iTextureSize / 2, c_iTextureSize / 2);

            //Calculate light value, based on color intensity (from 0f to 1f).
            s_fLightValue = (m_LightPixel.r + m_LightPixel.g + m_LightPixel.b) / 3f;

            if (m_bLogLightValue)
            {
                Debug.Log("Light Value: " + s_fLightValue);
            }

            yield return new WaitForSeconds(_fUpdateTime);
        }
    }
}

Y
Yura Milevsky, 2021-11-06
@Hackerman1

Mm.... I'm afraid it's impossible to do. There are no such functions in the unit and the language.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question