void calc_cam_diff_rot(Fmatrix item_transform, Fvector diff, Fvector& res) { Fmatrix cam_m; cam_m.i.set (Device.vCameraRight); cam_m.j.set (Device.vCameraTop); cam_m.k.set (Device.vCameraDirection); cam_m.c.set (Device.vCameraPosition); Fmatrix R; R.identity (); if(!fis_zero(diff.x)) { R.rotation(cam_m.i,diff.x); }else if(!fis_zero(diff.y)) { R.rotation(cam_m.j,diff.y); }else if(!fis_zero(diff.z)) { R.rotation(cam_m.k,diff.z); }; Fmatrix item_transform_i; item_transform_i.invert (item_transform); R.mulB_43(item_transform); R.mulA_43(item_transform_i); R.getHPB (res); res.mul (180.0f/PI); }
IC void q_scalem(Fmatrix &m, float v) { Fquaternion q; q.set(m); q_scale(q,v); m.rotation(q); }
//sclale base' * q by scale_factor returns result in matrix m_res IC void q_scale_vs_basem(Fmatrix &m_res,const Fquaternion &q, const Fquaternion &base,float scale_factor) { Fmatrix mb,imb; mb.rotation(base); imb.invert(mb); Fmatrix m;m.rotation(q); m_res.mul(imb,m); q_scalem(m_res,scale_factor); }
void CCustomMonster::mk_orientation(Fvector &dir, Fmatrix& mR) { // orient only in XZ plane dir.y = 0; float len = dir.magnitude(); if (len>EPS_S) { // normalize dir.x /= len; dir.z /= len; Fvector up; up.set(0,1,0); mR.rotation (dir,up); } }
IC bool check_scale(const Fquaternion &q) { Fmatrix m; m.rotation(q); return check_scale(m); }
void poses_interpolation::pose ( Fmatrix &p, float factor ) const { p.rotation( Fquaternion().slerp( q0, q1, factor ) ); p.c.lerp( p0, p1, factor ); }