迈克老狼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
代码
static void buildLookAtMatrix(double eyex, double eyey, double eyez,
                              
double centerx, double centery, double centerz,
                              
double upx, double upy, double upz,
                              
float m[16])
{
  
double x[3], y[3], z[3], mag;

  
/* Difference eye and center vectors to make Z vector. */
  z[
0= eyex - centerx;
  z[
1= eyey - centery;
  z[
2= eyez - centerz;
  
/* Normalize Z. */
  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;
  }

  
/* Up vector makes Y vector. */
  y[
0= upx;
  y[
1= upy;
  y[
2= upz;

  
/* X vector = Y cross 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];

  
/* Recompute Y = Z cross 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];

  
/* Normalize X. */
  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;
  }

  
/* Normalize Y. */
  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;
  }

  
/* Build resulting view matrix. 行主序*/
  m[
0*4+0= x[0];  m[0*4+1= x[1];
  m[
0*4+2= x[2];  m[0*4+3= -x[0]*eyex + -x[1]*eyey + -x[2]*eyez;

  m[
1*4+0= y[0];  m[1*4+1= y[1];
  m[
1*4+2= y[2];  m[1*4+3= -y[0]*eyex + -y[1]*eyey + -y[2]*eyez;

  m[
2*4+0= z[0];  m[2*4+1= z[1];
  m[
2*4+2= z[2];  m[2*4+3= -z[0]*eyex + -z[1]*eyey + -z[2]*eyez;

  m[
3*4+0= 0.0;   m[3*4+1= 0.0;  m[3*4+2= 0.0;  m[3*4+3= 1.0;
}

 

posted on 2009-12-11 14:08  迈克老狼  阅读(347)  评论(0编辑  收藏  举报