Polygon Facing

legomanww

New member
I am writing a little shader plugin, and I need to determine if the spot it is shading is facing the camera, or away. I need to be able to render both sides of the polygons, so I figured I could just turn on double sided, and then determine the direction the polygon is facing, then I can shade it appropriately.

I cannot figure out how I would determine wether or not the polygon is facing the camera or not.

I've got an idea that I would use the wNorm and the camera position coordinates it gives to determine if it's facing, but I don't know where to go from there.

thanks,
William
 

Lightwolf

obfuscated SDK hacker
Hi,

just a quick answer (I'm on the run)... the dot roduct is defined as the angle between to vectors. That should get you further.

Cheers,
Mike
 

legomanww

New member
thanks,

I think I've got it, I looked up the dot product again in my calc book, I think I got it now, played around with it when I was bored at school, so it makes sense now.
 

legomanww

New member
Well, I tried out the dot product thing, I don't know for sure that I got it right, but what I got didn't work.

I realized that the dot produt is limited to 180 degrees, so if you come from behind, I still don't see how I can determine if it's hitting it from behind or in front.

Thanks,
William
 

Lightwolf

obfuscated SDK hacker
legomanww said:
I realized that the dot produt is limited to 180 degrees, so if you come from behind, I still don't see how I can determine if it's hitting it from behind or in front.
If you're coming from behind, then the angle > 90° . You do have to be careful with the direction of your vectors prior to the dot product as well.

Cheers,
Mike
 

legomanww

New member
Alright, I think I got confused with the angles, think I've got it now. When the dot product results in less than 0 it is more than 90 degrees right?

How do I determine the vector for the incoming ray though? Is it (wPos - raySource) , if that was normalized to be a length of 1, would that be the incoming vector?
 
Last edited:

Lightwolf

obfuscated SDK hacker
legomanww said:
How do I determine the vector for the incoming ray though? Is it (wPos - raySource) , if that was normalized to be a length of 1, would that be the incoming vector?
Yes. You wouldn't even have to normalize it. If you do, you get the incoming _direction_ vector.

Cheers,
Mike
 

legomanww

New member
Alright, Thanks.

I'll work on it some more when I get home.

Does this look correct so far?

Code:
    N[0] = ( float ) sa->wNorm0[ 0 ];
    N[1] = ( float ) sa->wNorm0[ 1 ];
    N[2] = ( float ) sa->wNorm0[ 2 ];

	CVec[0] = ( float ) ((sa->wPos[0] - sa->raySource[0]));
	CVec[1] = ( float ) ((sa->wPos[0] - sa->raySource[0]));
	CVec[1] = ( float ) ((sa->wPos[0] - sa->raySource[0]));

	//normalize(N);
	//normalize(CVec);

	PolygonFacing = dot(N, CVec) / ((mag(N) * mag(CVec)));

	if ( PolygonFacing >= 0 )
	{
	    sa->color[ 0 ]= -PolygonFacing;
		sa->color[ 1 ]= -PolygonFacing;
		sa->color[ 2 ]= -PolygonFacing;

	}
	else 
	{

	    sa->color[ 0 ]= 0;
		sa->color[ 1 ]= 1;
		sa->color[ 2 ]= 0;
	}

	sa->luminous = 1;
 

Lightwolf

obfuscated SDK hacker
legomanww said:
Does this look correct so far?
Almost, except for a couple of typos I guess:
Code:
// These could be replaced by the macros from lwmath.h
N[0] = ( float ) sa->wNorm0[ 0 ];
N[1] = ( float ) sa->wNorm0[ 1 ];
N[2] = ( float ) sa->wNorm0[ 2 ];

CVec[0] = ( float ) ((sa->wPos[0] - sa->raySource[0]));
CVec[1] = ( float ) ((sa->wPos[1] - sa->raySource[1]));
CVec[2] = ( float ) ((sa->wPos[2] - sa->raySource[2]));

// both normalizes are probably optional, but better safe than sorry.
normalize(N);
normalize(CVec);

PolygonFacing = dot(N, CVec); // returns an agle in radians

if ( PolygonFacing > PI  )
{
  // faces away from raysource
  sa->color[ 0 ]= -PolygonFacing;
  sa->color[ 1 ]= -PolygonFacing;
  sa->color[ 2 ]= -PolygonFacing;
  // or VSET(sa->color, -PolygonFacing);
}
else 
{
  // faces toward raysource
  sa->color[ 0 ]= 0.0f; // don't let the compiler complain ;)
  sa->color[ 1 ]= 1.0f;
  sa->color[ 2 ]= 0.0f;
}
sa->luminous = 1.0f;
I'd also let those positions be doubles, a bit of extra accuracy is always good here.

Cheers,
Mike
 
Last edited:

legomanww

New member
Haha, wow, I just saw the typos with the vectors, being all [0]. Guess I forgot to change them, and that would explain the results I got.

Thanks a lot Mike, I really appreciate it.
 

Lightwolf

obfuscated SDK hacker
legomanww said:
Haha, wow, I just saw the typos with the vectors, being all [0]. Guess I forgot to change them, and that would explain the results I got.

Thanks a lot Mike, I really appreciate it.
You're welcome.

You know, it seems that 90% of all bugs produced end up being stuff like that, you stare at it for hours, and the next day you go "duh, how stupid" :)

Cheers,
Mike
 

legomanww

New member
Success.

I belive that I got it working correctly, I will post some pictures of the result later today.
 

legomanww

New member


 
Last edited:
Top Bottom