My code is like the following. All the data are proven to be correct and the single SoftTranslatef() is also correct.
/**

Get the look at matrix and store it into the matrix.

NOTE : here the matrix is stored rather than multiplied.

eye_x : the x coordinate of the eye point.

eye_y : the y coordinate of the eye point.

eye_z : the z coordinate of the eye point.

center_x : the x coordinate of the center point.

center_y : the y coordinate of the center point.

center_z : the z coordinate of the center point.

up_x : the x coordiante of the up vector.

up_y : the y coordiante of the up vector.

up_z : the z coordiante of the up vector.

*m : the matrix to be stored.
*/
void SoftGl::SoftLookAt(GLfloat eye_x, GLfloat eye_y, GLfloat eye_z,
GLfloat center_x, GLfloat center_y, GLfloat center_z,
GLfloat up_x, GLfloat up_y, GLfloat up_z, GLfloat *m)
{
GLfloat head_vector[3];
GLfloat roll_vector[3];
GLfloat up_vector[3];head_vector[0] = center_x  eye_x;
head_vector[1] = center_y  eye_y;
head_vector[2] = center_z  eye_z;up_vector[0] = up_x;
up_vector[1] = up_y;
up_vector[2] = up_z;//get the effect of rotate first
GeoUtility::Normalize(head_vector);
GeoUtility::Normalize(up_vector);
GeoUtility::XProduct(head_vector, up_vector, roll_vector);
GeoUtility::Normalize(roll_vector);memset(m, 0, 16 * sizeof(GLfloat));
memcpy(m, roll_vector, 3 * sizeof(GLfloat));
memcpy(m + 4, up_vector, 3 * sizeof(GLfloat));
memcpy(m + 8, head_vector, 3 * sizeof(GLfloat));
m[15] = 1;//then multiply the translation
//notice that the translation is to the reverse direction
SoftTranslatef(eye_x, eye_y, eye_z, m);
}
However, when I tried this code with a single translation to the positive direction of z axis, the [10] position of the matrix is 1, while the matrix got from OpenGL stack is 1.
Anyone can tell me what is the problem of the above code? I really was confused.
Thank you very much.