在博客上看到了一篇文章,讲Opengl Camera类的设计。
有好多内容没有看懂,求解释啊。
博客原文:
http://blog.csdn.net/hobbit1988/article/details/7956838#comments
其中以下内容都没有看懂背后的矩阵运算究竟是什么。求解答
void Camera::setModelViewMatrix()
{
float m[16];
Vector3 eVec(eye.x, eye.y,eye.z);
m[0]=u.x; m[4]=u.y; m[8]=u.z; m[12]=-eVec.dot(u);
m[1]=v.x; m[5]=v.y; m[9]=v.z; m[13]=-eVec.dot(v);
m[2]=n.x; m[6]=n.y; m[10]=n.z; m[14]=-eVec.dot(n);
m[3]=0; m[7]=0; m[11]=0; m[15]=1.0;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(m); //用M矩阵替换原视点矩阵
}
/* 摄像机绕n、v、u轴旋转的计算函数*/
void Camera::roll(float angle)
{
float cs=cos(angle*3.14159265/180);
float sn=sin(angle*3.14159265/180);
Vector3 t(u);
Vector3 s(v);
u.set(cs*t.x-sn*s.x, cs*t.y-sn*s.y, cs*t.z-sn*s.z);
v.set(sn*t.x+cs*s.x, sn*t.y+cs*s.y, sn*t.z+cs*s.z);
setModelViewMatrix(); //每次计算完坐标轴变化后调用此函数更新视点矩阵
}
void Camera::yaw(float angle)
{
float cs=cos(angle*3.14159265/180);
float sn=sin(angle*3.14159265/180);
Vector3 t(n);
Vector3 s(u);
n.set(cs*t.x-sn*s.x, cs*t.y-sn*s.y, cs*t.z-sn*s.z);
u.set(sn*t.x+cs*s.x, sn*t.y+cs*s.y, sn*t.z+cs*s.z);
setModelViewMatrix();
}
void Camera::pitch(float angle)
{
float cs=cos(angle*3.14159265/180);
float sn=sin(angle*3.14159265/180);
Vector3 t(v);
Vector3 s(n);
v.set(cs*t.x-sn*s.x, cs*t.y-sn*s.y, cs*t.z-sn*s.z);
n.set(sn*t.x+cs*s.x, sn*t.y+cs*s.y, sn*t.z+cs*s.z);
setModelViewMatrix();
}
/* 摄像机绕三个轴平移的计算函数*/
void Camera::slide(float du, float dv, float dn)
{
eye.x+=du*u.x+dv*v.x+dn*n.x;
eye.y+=du*u.y+dv*v.y+dn*n.y;
eye.z+=du*u.z+dv*v.z+dn*n.z;
look.x+=du*u.x+dv*v.x+dn*n.x;
look.y+=du*u.y+dv*v.y+dn*n.y;
look.z+=du*u.z+dv*v.z+dn*n.z;
setModelViewMatrix();
}