/*Guarda a matriz de translação e rotação na classe para usar nos objetos*/
   void MatrizTransf() 
   {
      Matriz<4,4> ret;
      ret.setZero();
      Matriz<4,4> trans;
      trans.setZero();
      trans = mat.Translate3D(-_p(0,0),-_p(1,0),-_p(2,0));
      Matriz<4,4> rot;
      rot.setZero();
      Matriz<4,1> n = mat.normalizeVector3D(_N);
      Matriz<4,1> u = mat.normalizeVector3D(_U);//mat.normalizeVector3D(mat.crossProduct3D(_V,_N));
      Matriz<4,1> v = mat.normalizeVector3D(_V);//mat.normalizeVector3D(mat.crossProduct3D(u,n));
      rot(0,0) = u(0,0);
      rot(0,1) = u(1,0);
      rot(0,2) = u(2,0);
      rot(1,0) = v(0,0);
      rot(1,1) = v(1,0);
      rot(1,2) = v(2,0);
      rot(2,0) = -n(0,0);
      rot(2,1) = -n(1,0);
      rot(2,2) = -n(2,0);

      rot(3,3) = 1;

      ret = rot*trans;
      _M = ret;
   }
 Matriz<4,1> applyPersp(Matriz<4,1> _LoL)
 {
    Matriz<4,1> t;
    float r = 1/DISTANCE_PERSPECTIVE;
    Matriz<4,4> Tp;
    Tp.setZero();
    Tp(0,0) = 1;
    Tp(1,1) = 1;
    if(tipo_de_projecao == 1){
       Tp(3,2) = -r;
    }else if(tipo_de_projecao == 2){
       Tp(3,2) = -r;
       Tp(3,1) = r;
    }else if(tipo_de_projecao == 3){
       Tp(3,1) = r;
       Tp(3,0) = r;
       Tp(3,2) = -r;
    }
    t = Tp*_LoL;
    if(t(0,0) != 0.f)
       t(0,0) = t(0,0)/t(3,0);
    if(t(1,0) != 0.f)
       t(1,0) = t(1,0)/t(3,0);
    t(2,0) = 0;
    t(3,0) = 1;
    return (t);
 }
 Matriz<4,1> apllyOrto(Matriz<4,1> _LoL)
 {
    Matriz<4,4> t;
    t.setZero();
    t(0,0) = 1;
    t(1,1) = 1;
    t(3,3) = 1;
    return t*_LoL;
 }
Matriz<3,3> Scale2D1(float xi)
{
   Matriz<3,3> ret;
   ret.setZero();
   ret(0,0) = xi;
   ret(1,1) = xi;
   ret(2,2) = 1;
   return ret;
}
Matriz<3,3> rotation2D(float graus)
{
   Matriz<3,3> ret;
   ret.setZero();
   ret(0,0) = cos(graus);
   ret(0,1) = -sin(graus);
   ret(1,0) = sin(graus);
   ret(1,1) = cos(graus);
   ret(2,2) = 1;
   return ret;
}
 Matriz<4,1> projeta(Matriz<4,1> t)
 {
    Matriz<4,1> res;
    res.setZero();
    if(tipo_de_projecao == 0){ //ortrográfica
       res = apllyOrto(_M*t);
    }
    else { //perspectiva
       res = applyPersp(_M*t);
    }
    return res;
 }
Matriz<3,3> Translate2D(float xi,float yi, float xf, float yf)
{
   Matriz<3,3> ret;
   ret.setZero();

   ret(0,0) = 1;
   ret(1,1) = 1;
   ret(2,2) = 1;
   ret(0,2) = xf-xi;
   ret(1,2) = yf-yi;
   return ret;
}
Matriz<m,n> operator*(const Matriz<m,p>& a, const Matriz<p,n>& b)
{
   Matriz<m,n> ret;
   ret.setZero();

   for(int i = 0; i < m; i++){
      for(int j = 0; j < n; j++){
         for(int k = 0 ; k < p ; k++){
            ret(i,j) += a(i,k) * b(k,j);
         }
      }

   }
   return ret;
}