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