LookAt matrix probem

Hi all, I don’t know if this is the right forum where to post my question. I’m not even using openGL, but I’m writing a matrix class that follows the same layout and conventions than openGL, so I hope to receive halp here.

I’m writing a LookAt method with the following code:

void matrix::LookAt(const vector4 &eye, const vector4 &target, const vector4 &up)
{
	if(eye == target) 
	{
		Identity();
		return; //eye and target are the same
	}    
	
	vector4 z(eye - target);
	z.Normalize();
 
	vector4 u(up);
	if(IsZero(z.x) && !IsZero(z.y) && IsZero(z.z)) u = vector4(0, 0, 1.0); 

	vector4 x(u^z);   
	x.Normalize();
    
	vector4 y(z^x);
    
	mat[0][0] = x.x;
	mat[0][1] = x.y;
	mat[0][2] = x.z;
	mat[0][3] = 0;
	mat[1][0] = y.x;
	mat[1][1] = y.y;
	mat[1][2] = y.z;
	mat[1][3] = 0; 
	mat[2][0] = z.x;
	mat[2][1] = z.y;
	mat[2][2] = z.z;
	mat[2][3] = 0;  
	mat[3][0] = -(x*eye);  
	mat[3][1] = -(y*eye);
	mat[3][2] = -(z*eye);  
	mat[3][3] = 1; 
}

I searched all over the web for the formula. I used the one specified in the DX reference for right handed matrix, as well as many other places. This one just flips my y axis.
With the following parameters I expect to ge the identity matrix:
eye = (0,0,0)
target = (0,0,-1)
up = (0,1,0).

But the element in (1,1) is -1 instead than 1.
Where am I wrong?
Thank you!

Hi,

I think that (changes):

vector4 z(target - eye);

mat[3][0] = -eye;
mat[3][1] = -eye;
mat[3][2] = -eye;
mat[3][3] = 1;

Ido

thank you, but with these changes I get all the diagonal elements = -1 (except the [4][4] one, of course)

Hi, I have implemented a vector math library already. You may want to take a look at it.

[ www.trenki.net | vector_math (3d math library) | software renderer ]

Thank you, tomorrow I will give it a look. By the way, I’m from South Tyrol too, Bolzano, to be more precise.
Grazie ancora (oder danke schön :-)!

I gave a look to the library written by Trenki. It will be of inspiration for me (expecially for some more operations over vectors and matrices that I may add to my own library) but it did not help me with my specific problem: as I said, I’ve tried many different versions, but even while I can set it up to retutn the identity matrix in the previous example, I still don’t know if this would be a correct matrix or not.
Is there someone willing to check my code? Perhaps I made something wrong in other parts (cross mult i.e.)?

 gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx,

 116           GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy,

 117           GLdouble upz)

 118 {

 119     float forward[3], side[3], up[3];

 120     GLfloat m[4][4];

 121 

 122     forward[0] = centerx - eyex;

 123     forward[1] = centery - eyey;

 124     forward[2] = centerz - eyez;

 125 

 126     up[0] = upx;

 127     up[1] = upy;

 128     up[2] = upz;

 129 

 130     normalize(forward);

 131 

 132     /* Side = forward x up */

 133     cross(forward, up, side);

 134     normalize(side);

 135 

 136     /* Recompute up as: up = side x forward */

 137     cross(side, forward, up);

 138 

 139     __gluMakeIdentityf(&m[0][0]);

 140     m[0][0] = side[0];

 141     m[1][0] = side[1];

 142     m[2][0] = side[2];

 143 

 144     m[0][1] = up[0];

 145     m[1][1] = up[1];

 146     m[2][1] = up[2];

 147 

 148     m[0][2] = -forward[0];

 149     m[1][2] = -forward[1];

 150     m[2][2] = -forward[2];

 151 

 152     glMultMatrixf(&m[0][0]);

 153     glTranslated(-eyex, -eyey, -eyez);

 154 } 

I hope it helps. If you need more glu source look here .