IndrekSnt
11-04-2003, 09:56 AM
I have a world that consists of many quads and polygons, it has also some lighting. In order OpenGL to lit everything correctly, it needs normals with glNormal3f(float X,float Y,float Z); Yes, I used it but some walls are lightened up, some not(some are black). http://www.opengl.org/discussion_boards/ubb/frown.gif.?.
Here are my functions:
VPoint cross(VPoint v1,VPoint v2){
VPoint normal;
normal.x=(v1.y*v2.z)-(v1.z*v2.y);
normal.y=(v1.z*v2.x)-(v1.x*v2.z);
normal.z=(v1.x*v2.y)-(v1.y*v2.x); return normal;}
//
float Magn(VPoint n){
float m;
m=(float)sqrt((n.x*n.x)+(n.y*n.y)+(n.z*n.z));
return m;}
//
VPoint Normalise(VPoint n){
float m=Magn(n);
n.x/=m; n.y/=m; n.z/=m;
return n;}
//
VPoint GetNormal(VPoint v[QUAD_P]){
VPoint v1=v[2]-v[0];
VPoint v2=v[1]-v[0];
VPoint n=cross(v1,v2);
n=Normalise(n); return n;}
And here is VPoint structure:
struct VPoint{
float x,y,z;
VPoint(){}
VPoint(float X,float Y,float Z){
x=X; y=Y; z=Z;}
VPoint operator+(VPoint v){
return VPoint(x+v.x, y+v.y, z+v.z);}
VPoint operator-(VPoint v){
return VPoint(x-v.x, y-v.y, z-v.z);}
VPoint operator*(float v){
return VPoint(x*v, y*v, z*v);}
VPoint operator/(float v){
return VPoint(x/v,y/v,z/v);}
};
I think the normal coordinates come wrong when I use GetNormal(); function, how to make it working?
Any suggestions are welcome...
Here are my functions:
VPoint cross(VPoint v1,VPoint v2){
VPoint normal;
normal.x=(v1.y*v2.z)-(v1.z*v2.y);
normal.y=(v1.z*v2.x)-(v1.x*v2.z);
normal.z=(v1.x*v2.y)-(v1.y*v2.x); return normal;}
//
float Magn(VPoint n){
float m;
m=(float)sqrt((n.x*n.x)+(n.y*n.y)+(n.z*n.z));
return m;}
//
VPoint Normalise(VPoint n){
float m=Magn(n);
n.x/=m; n.y/=m; n.z/=m;
return n;}
//
VPoint GetNormal(VPoint v[QUAD_P]){
VPoint v1=v[2]-v[0];
VPoint v2=v[1]-v[0];
VPoint n=cross(v1,v2);
n=Normalise(n); return n;}
And here is VPoint structure:
struct VPoint{
float x,y,z;
VPoint(){}
VPoint(float X,float Y,float Z){
x=X; y=Y; z=Z;}
VPoint operator+(VPoint v){
return VPoint(x+v.x, y+v.y, z+v.z);}
VPoint operator-(VPoint v){
return VPoint(x-v.x, y-v.y, z-v.z);}
VPoint operator*(float v){
return VPoint(x*v, y*v, z*v);}
VPoint operator/(float v){
return VPoint(x/v,y/v,z/v);}
};
I think the normal coordinates come wrong when I use GetNormal(); function, how to make it working?
Any suggestions are welcome...