Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

Fahrenheit451

Verify normal calcs

This topic is 5159 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

The answer is probably staring me in the face again, but I guess I just need someone to verify my thinking! I am still getting to grips with 3D and learning about normals at the moment. I calculate my normal from the two vectors I produce from the three points of my triangle, and also draw the triangle and a line from the center point of the triangle to the center point plus the normal. It certainly looks correct on screen for various triangles, but I want to verify it. I guess the two ways are to take the dot product of the normal and the plane and check if it's zero, or check the angle between the plane and the normal for 90 degrees. Am I doing this correctly below? Thanks in advance.
// setup three points of triangle and draw it

VECTOR p1,p2,p3;
p1.Set(0.0f,0.0f,0.0f);
p2.Set(2.0f,2.0f,0.0f);
p3.Set(1.0f,1.0f,-2.0f);
glBegin(GL_TRIANGLES);
  glColor3f(0.5f,0.0f,0.0f);
  glVertex3f(p1.x,p1.y,p1.z);
  glVertex3f(p2.x,p2.y,p2.z);
  glVertex3f(p3.x,p3.y,p3.z);
glEnd();

// calculate 2 vectors for those 3 points

VECTOR v1,v2;
  v1.x = p2.x - p1.x;
  v1.y = p2.y - p1.y;
  v1.z = p2.z - p1.z;
  v2.x = p3.x - p2.x;
  v2.y = p3.y - p2.y;
  v2.z = p3.z - p2.z;

// calculate and display normal as a line projecting

// out from center of triangle

VECTOR normal, centerTriangle;
  normal.Cross(v1,v2);
  normal.Normalize();
centerTriangle.Set((p1.x+p2.x+p3.x)/3.0f,(p1.y+p2.y+p3.y)/3.0f,(p1.z+p2.z+p3.z)/3.0f);
glBegin(GL_LINES);
  glColor3f(0.5f,0.5f,0.5f);
  glVertex3f(centerTriangle.x,centerTriangle.y,centerTriangle.z);
  glVertex3f(centerTriangle.x+normal.x,centerTriangle.y+normal.y,centerTriangle.z+normal.z);
glEnd();

// Verify normal

VECTOR plane;
plane = centerTriangle - p1; // ?? is this correct ??

GLfloat dotP = DotProduct(plane,normal);
GLfloat angle = acos(dotP)*(360/(2*M_PI));
[edited by - Fahrenheit451 on April 11, 2004 6:46:09 AM] [edited by - Fahrenheit451 on April 11, 2004 7:01:23 AM]

Share this post


Link to post
Share on other sites
Advertisement
quote:
Original post by Fahrenheit451
...I guess the two ways are to take the dot product of the normal and the plane and check if it's zero, or check the angle between the plane and the normal for 90 degrees...

or you could take the cross product of the normal and any vector in the plane and check if the result is also in the plane, or you could .... probably quite a few ways, but your way is a good way.


// Verify normal
VECTOR plane; // assuming plane is any vector in the plane
plane = centerTriangle - p1; // if centertriangle is correctly calculated then this is correct...
// also guaranteed valid by definition of your plane...
plane = p1 - p2;
plane = p2 - p1;
plane = p2 - p3;
plane = p1 - p3;
...
// normalize the plane vector

GLfloat dotP = DotProduct(plane,normal); // this will give the right result if both vectors are normalized
GLfloat angle = acos(dotP)*(360/(2*M_PI)); // pretty redundant calculation if checking for zero



since 360/(2*PI) != 0 ,(in my universe anyway) you could check the dotP directly. -(do you want the angle in radians or degrees? this would yield degrees - as you of course already know)
if you normalize both the plane and the normal vector the calculation would be (in radians of course)
angle = acos(dotP)

The mathematically right formula would be: (in some quasi mathcode)
cos(alpha) = (v*u)/(|v||u|)
read as v dot u divided by abs(v) times abs(u)

[edited by - JOL on April 11, 2004 8:42:53 AM]

Share this post


Link to post
Share on other sites
quote:
Original post by Fahrenheit451
I guess I was thinking that the two vectors had to be "joined" to properly work out the dot product, but it appears not.


I understand what you mean but you must remember to diffrentiate between points and directions. And they are actually joined in origo...
The normal is already calculated and actually not ''on'' the plane anymore, it emerges from origo and describes a direction and not a point. Calculating a vector lying in the plane also emerges from origo. You should always remember to distinguish between a vector pointing at a point in the plane, and a vector itself lying in the plane.
Points and directions, same but different.

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!