# Generate a 2D field-of-view cone

I have a bunch of randomly generated boids flying around on my screen, but I want a function that can give them a field-of-view where they can "see" other boids or obstacles.

The code I wrote gets all the pixels around the boid in a circle of some size. Then I try to filter through them to find only the ones in front of the boid within a 30 degree cone-shaped field of view.

I am making this project in Unity using compute shaders written in HLSL.

For each boid, I gave a float2 position and a float angle. In my kernel, I run a function that tries to set the color of all the pixels inside my cone to red. Here's the code:

for(int x = -viewDistance; x <= viewDistance; x++){
for(int y = -viewDistance; y <= viewDistance; y++){
float2 sample = float2(x, y);
float d = length(sample);

if(d <= viewDistance && d > 0){
// sensorAngle is an angle in radians defining the "view margins" of my cone.
float minAngle = boid.angle - sensorAngle;
float maxAngle = boid.angle + sensorAngle;

float theta = acos(sample.x / d);
if(theta >= minAngle && theta <= maxAngle){
float2 p = sample + boid.position;
Result[int2(p.x, p.y)] = float4(1, 0, 0, 1);
}
}
}
}


As you can see I get all the pixels within a certain boundary and filter out ones that are too far away. This works perfectly in retrieving all pixels within a circle around my boid. My problem is with checking if the pixel is within my boid's view-cone.

I tried following this explanation for that code. This works perfectly, but it seems to "mirror" my cone over the x-axis like this:

Also, my boids get generated with a random number between 0 and 360 as their angle. I multiply this angle with PI / 180 to convert degrees to radians (This all happens on my C# side and then I send a ComputeBuffer through to my Compute Shader). However, I noticed that when the angle is generated larger than 180 degrees, the cone doesn't even render at all.

What might be a better method to go about calculating this FOV cone for each of my boids?

• I'm absolutely terrible with trigonometry but I recall that there are different functions to get the interior angle vs the exterior angle - you might just be using the wrong function (I assume acos?) Alternately, a quick fix looks like it might just be to flip the greater than and less than in your comparison? – Appleguysnake Apr 1 at 18:29
• If you haven't already seen it, Sebastian Lague has a very good video implementing boids, including a compute shader version complete with obstacle avoidance and everything. youtube.com/watch?v=bqtqltqcQhw The main takeaway I think is that you shouldn't be scanning every pixel in the view radius as that's a ton of work for a lot of empty space, compute shader or not. Instead, separate your boid logic from your visual rendering. – Appleguysnake Apr 1 at 18:43