es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo detectar si un punto existe en el sector de luz de un círculo? (detección de FOV)

Estoy tratando de implementar la detección de un punto de luz en forma de cono para un juego. Actualmente estoy calculando la iluminación utilizando la siguiente función dentro de mi fragment shader.

“`
vec4 calculateLight(Light light)
{
float aspectRatio = resolution.x / resolution.y; //cantidad de ancho / alto
if (aspectRatio > 1.0)
light.radius.x /= aspectRatio;
else
light.radius.x /= aspectRatio;

vec2 lightDir = fragmentPosition.xy – light.position.xy;
float lightDistance = length(lightDir);
if (length(lightDir / light.radius) >= 1.0)
return vec4(0, 0, 0, 1); //fuera del radio hazlo negro

if (dot(normalize(lightDir), normalize(light.spotDir.xy)) < cos(light.spotAngle/2))
return vec4(0, 0, 0, 1); //fuera del radio hazlo negro

return light.intensity * (1 – length(lightDir / light.radius)) * light.colour;
}

Sin embargo, también me gustaría utilizar mi luz como una herramienta de detección, que represente la línea de visión del enemigo, ¿hay alguna manera de hacerlo? Mi componente de luz:

struct LightComponent
{
Vec4 colour;
Vec3 pos;
Vec2 radius;
float intensity;
bool lightEnabled;
//cosas de spotlight
float spotAngle;
Vec3 spotDir;
float DirectionAngle;
bool takeVector = true;

static Vec4 ambientLight;

LightComponent();

void ImGuiDraw();

};

Aquí, el rango se refiere al radio.

View post on imgur.com

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la detección de un foco de luz (en forma de cono) en tu juego, deberás modificar la función de iluminación existente para incluir una comprobación en forma de cono. Una forma de lograr esto es calcular el producto punto entre el vector de dirección de la luz normalizado y el vector de dirección del cono normalizado.

    Suponiendo que tu valor spotDir representa la dirección del cono, puedes modificar la función calculateLight() existente de la siguiente manera:

    vec4 calculateLight(Light light)
    {
        float aspectRatio = resolution.x / resolution.y; //cantidad de ancho / alto
        if (aspectRatio > 1.0)
            light.radius.x /= aspectRatio;
        else
            light.radius.x /= aspectRatio;
    
        vec2 lightDir = fragmentPosition.xy - light.position.xy;
        float lightDistance = length(lightDir);
    
        // Comprueba si está fuera del radio de luz
        if (length(lightDir / light.radius) >= 1.0)
            return vec4(0, 0, 0, 1);
    
        // Comprueba si está fuera del ángulo del cono
        float cosAngle = dot(normalize(lightDir), normalize(light.spotDir.xy));
        if (cosAngle < cos(light.spotAngle/2))
            return vec4(0, 0, 0, 1);
    
        // Calcula la intensidad de iluminación
        float rangeFactor = 1 - length(lightDir / light.radius);
        float angleFactor = pow(cosAngle, light.DirectionAngle);
        float intensity = light.intensity * rangeFactor * angleFactor;
        return light.colour * intensity;
    }
    

    Aquí, light.spotAngle representa el ángulo del cono y light.DirectionAngle representa el ángulo del borde del cono. Puedes ajustar los valores de estos parámetros para aumentar o disminuir el tamaño del cono de luz.

    Para usar tu luz como herramienta de detección para la línea de visión de un enemigo, simplemente configura el valor colour del componente de luz a un color diferente cuando detecte al jugador. También puedes ajustar el ángulo o la dirección del cono en función de la orientación del enemigo para que la forma del cono represente con precisión su campo de visión.

Comments are closed.