Looking for hits

We are going to check now whether or not the color that was obtained from the off-screen framebuffer corresponds to any of the objects in the scene. Remember here that we are using colors as object labels. If the color matches one of the objects then we call it a hit. If it does not we call it a miss.

When looking for hits, we compare each object's diffuse color with the label obtained from the offscreen framebuffer. There is a consideration to make here: each color channel of the label is in the [0,255] range while the object diffuse colors are in the [0,1] range. So, we need to consider this before we can actually check for any possible hits. We do this in the compare function:

function compare(readout, color){
return (Math.abs(Math.round(color[0]*255) - readout[0]) <= 1 &&
Math.abs(Math.round(color[1]*255) - readout[1]) <= 1 &&
Math.abs(Math.round(color[2]*255) - readout[2]) <= 1);
}

Here we are scaling the diffuse property to the [0,255] range and then we are comparing each channel individually. Note that we do not need to compare the alpha channel. If we had the two objects with the same color but different alpha channel, we would use the alpha channel in the comparison as well but in our example we do not have that scenario, therefore the comparison of the alpha channel is not relevant.

Also, note that the comparison is not precise because of the fact that we are dealing with decimal values in the [0,1] range. Therefore, we assume that after rescaling colors in this range and subtracting the readout (object label) if the difference is less than one for all the channels then we have a hit. The less then or equal to one comparison is a fudge factor.

Now, we just need to go through the object list in the Scene object and check if we have a miss or a hit. We are going to use two auxiliary variables here: found, which will be true in case of having a hit and pickedObject to retrieve the object that was hit.

var pickedObject = null, ob = null;
for(var i = 0, max = Scene.objects.length; i < max; i+=1){
ob = Scene.objects[i];
if (compare(readout, ob.diffuse)){
pickedObject = ob;
break;
}
}

The previous snippet of code will tell us if we have had a hit or a miss, and also what object we hit.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.149.213.209