gluLookAt() UVN相機模型,設定視點(相機)位置和視綫方向(矩陣運算).
void gluLookAt( GLdouble eyeX,
GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ); |
OpenGL ES冇gluLookAt() , 手工生成『旋轉矩陣』『相機位置』函式
void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez,
GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz) { GLfloat m[16];// 旋轉矩陣 GLfloat x[3], y[3], z[3]; GLfloat mag; //生成旋轉矩陣 // Z矢量 z[0] = eyex – centerx; z[1] = eyey – centery; z[2] = eyez – centerz; mag = sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]); if (mag) { z[0]/= mag; z[1]/= mag; z[2]/= mag; }
// Y矢量 y[0] = upx; y[1] = upy; y[2] = upz;
// X 矢量 = Y 叉積 Z x[0] = y[1] * z[2] – y[2] * z[1]; x[1] = -y[0] * z[2] + y[2] * z[0]; x[2] = y[0] * z[1] – y[1] * z[0];
// 重新計算 Y = Z 叉積 X y[0] = z[1] * x[2] – z[2] * x[1]; y[1] = -z[0] * x[2] + z[2] * x[0]; y[2] = z[0] * x[1] – z[1] * x[0];
// 叉積給出了平行四邊形的面積,對于非垂直單位長度向量;所以在這裏標準化x,y mag = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]); if (mag) { x[0]/= mag; x[1]/= mag; x[2]/= mag; }
mag = sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]); if (mag) { y[0]/= mag; y[1]/= mag; y[2]/= mag; }
#define M(row,col) m[col*4+row] M(0, 0) = x[0]; M(0, 1) = x[1]; M(0, 2) = x[2]; M(0, 3) = 0.0; M(1, 0) = y[0]; M(1, 1) = y[1]; M(1, 2) = y[2]; M(1, 3) = 0.0; M(2, 0) = z[0]; M(2, 1) = z[1]; M(2, 2) = z[2]; M(2, 3) = 0.0; M(3, 0) = 0.0; M(3, 1) = 0.0; M(3, 2) = 0.0; M(3, 3) = 1.0; #undef M glMultMatrixf(m);
// 視點(相機)位置 glTranslatef(-eyex, -eyey, -eyez); } |