GLfloat mdl[16];
glGetFloatv(GL_MODELVIEW_MATRIX, mdl);
camera_org[0] = -(mdl[0] * mdl[12] + mdl[1] * mdl[13] + mdl[2] * mdl[14]);
camera_org[1] = -(mdl[4] * mdl[12] + mdl[5] * mdl[13] + mdl[6] * mdl[14]);
camera_org[2] = -(mdl[8] * mdl[12] + mdl[9] * mdl[13] + mdl[10] * mdl[14]);
亲测正确,感谢墙外不知名的大神!困扰了我好长时间T.T
===============================================模型坐标====================================================
//计算该视点下,该点的坐标;
Point_3 new_view_point(Point_3 p){
double mv_MATRIX [16];
glGetDoublev( GL_MODELVIEW_MATRIX, mv_MATRIX );
double inverse_m[16];
inverse_matrix(mv_MATRIX,4,inverse_m);//得到mv_MATRIX的逆矩阵inverse_m
double point[4];
point[0] = p.hx();
point[1] = p.hy();
point[2] = p.hz();
point[3] = 1;
double result[4];
multipy_cross(inverse_m,point,result);//模型坐标转换到视点坐标;
Point_3 newp(result[0],result[1],result[2]);
return newp;
}
//计算矩阵pModelViewMatrix[16] 叉乘 point[4];
void multipy_cross(double matrix[],double point[],double result[]){
double matrix1[16];
for(int i = 0;i<16;i++){
matrix1[i] = matrix[i];//避免改变matrix的值;
}
result[0] = matrix1[0]*point[0] + matrix1[1]*point[1] + matrix1[2]*point[2] + matrix1[3]*point[3];
result[1] = matrix1[4]*point[0] + matrix1[5]*point[1] + matrix1[6]*point[2] + matrix1[7]*point[3];
result[2] = matrix1[8]*point[0] + matrix1[9]*point[1] + matrix1[10]*point[2] + matrix1[11]*point[3];
result[3] = matrix1[12]*point[0] + matrix1[13]*point[1] + matrix1[14]*point[2] + matrix1[15]*point[3];
}
模型转动,相当于模型不动视点转动。
也就是说,可以认为模型没动,求视点坐标后,进行相应操作。
若有必要,可以按照上面的办法求模型转动后的坐标,但视点就不要再计算转动后的了。