TVector3d CCharShape::AdjustRollvector (const CControl *ctrl, const TVector3d& vel_, const TVector3d& zvec) { TMatrix<4, 4> rot_mat; TVector3d vel = ProjectToPlane(zvec, vel_); vel.Norm(); if (ctrl->is_braking) { rot_mat = RotateAboutVectorMatrix (vel, ctrl->turn_fact * BRAKING_ROLL_ANGLE); } else { rot_mat = RotateAboutVectorMatrix (vel, ctrl->turn_fact * MAX_ROLL_ANGLE); } return TransformVector (rot_mat, zvec); }
TVector3 CCharShape::AdjustRollvector (CControl *ctrl, TVector3 vel, TVector3 zvec) { TMatrix rot_mat; vel = ProjectToPlane (zvec, vel); NormVector (&vel); if (ctrl->is_braking) { RotateAboutVectorMatrix (rot_mat, vel, ctrl->turn_fact * BRAKING_ROLL_ANGLE); } else { RotateAboutVectorMatrix (rot_mat, vel, ctrl->turn_fact * MAX_ROLL_ANGLE); } return TransformVector (rot_mat, zvec); }
void CCharShape::AdjustOrientation (CControl *ctrl, double dtime, double dist_from_surface, TVector3 surf_nml) { TVector3 new_x, new_y, new_z; TMatrix cob_mat, inv_cob_mat; TMatrix rot_mat; TQuaternion new_orient; double time_constant; static TVector3 minus_z_vec = { 0, 0, -1}; static TVector3 y_vec = { 0, 1, 0 }; if (dist_from_surface > 0) { new_y = ScaleVector (1, ctrl->cvel); NormVector (&new_y); new_z = ProjectToPlane (new_y, MakeVector(0, -1, 0)); NormVector (&new_z); new_z = AdjustRollvector (ctrl, ctrl->cvel, new_z); } else { new_z = ScaleVector (-1, surf_nml); new_z = AdjustRollvector (ctrl, ctrl->cvel, new_z); new_y = ProjectToPlane (surf_nml, ScaleVector (1, ctrl->cvel)); NormVector(&new_y); } new_x = CrossProduct (new_y, new_z); MakeBasismatrix_Inv (cob_mat, inv_cob_mat, new_x, new_y, new_z); new_orient = MakeQuaternionFromMatrix (cob_mat); if (!ctrl->orientation_initialized) { ctrl->orientation_initialized = true; ctrl->corientation = new_orient; } time_constant = dist_from_surface > 0 ? TO_AIR_TIME : TO_TIME; ctrl->corientation = InterpolateQuaternions ( ctrl->corientation, new_orient, min (dtime / time_constant, 1.0)); ctrl->plane_nml = RotateVector (ctrl->corientation, minus_z_vec); ctrl->cdirection = RotateVector (ctrl->corientation, y_vec); MakeMatrixFromQuaternion (cob_mat, ctrl->corientation); // Trick rotations new_y = MakeVector (cob_mat[1][0], cob_mat[1][1], cob_mat[1][2]); RotateAboutVectorMatrix (rot_mat, new_y, (ctrl->roll_factor * 360)); MultiplyMatrices (cob_mat, rot_mat, cob_mat); new_x = MakeVector (cob_mat[0][0], cob_mat[0][1], cob_mat[0][2]); RotateAboutVectorMatrix (rot_mat, new_x, ctrl->flip_factor * 360); MultiplyMatrices (cob_mat, rot_mat, cob_mat); TransposeMatrix (cob_mat, inv_cob_mat); TransformNode (0, cob_mat, inv_cob_mat); }
void CCharShape::AdjustOrientation (CControl *ctrl, bool eps, ETR_DOUBLE dist_from_surface, const TVector3d& surf_nml) { TVector3d new_y, new_z; static const TVector3d minus_z_vec(0, 0, -1); static const TVector3d y_vec(0, 1, 0); if (dist_from_surface > 0) { new_y = ctrl->cvel; new_y.Norm(); new_z = ProjectToPlane (new_y, TVector3d(0, -1, 0)); new_z.Norm(); new_z = AdjustRollvector (ctrl, ctrl->cvel, new_z); } else { new_z = -1.0 * surf_nml; new_z = AdjustRollvector (ctrl, ctrl->cvel, new_z); new_y = ProjectToPlane (surf_nml, ctrl->cvel); new_y.Norm(); } TVector3d new_x = CrossProduct (new_y, new_z); TMatrix<4, 4> cob_mat(new_x, new_y, new_z); TQuaternion new_orient = MakeQuaternionFromMatrix (cob_mat); if (!ctrl->orientation_initialized) { ctrl->orientation_initialized = true; ctrl->corientation = new_orient; } ETR_DOUBLE time_constant = dist_from_surface > 0 ? TO_AIR_TIME : TO_TIME; float dtime = eps ? EPS : g_game.time_step; ctrl->corientation = InterpolateQuaternions ( ctrl->corientation, new_orient, min (dtime / time_constant, 1.0)); ctrl->plane_nml = RotateVector (ctrl->corientation, minus_z_vec); ctrl->cdirection = RotateVector (ctrl->corientation, y_vec); cob_mat = MakeMatrixFromQuaternion(ctrl->corientation); // Trick rotations new_y = TVector3d (cob_mat[1][0], cob_mat[1][1], cob_mat[1][2]); TMatrix<4, 4> rot_mat = RotateAboutVectorMatrix(new_y, (ctrl->roll_factor * 360)); cob_mat = rot_mat * cob_mat; new_x = TVector3d (cob_mat[0][0], cob_mat[0][1], cob_mat[0][2]); rot_mat = RotateAboutVectorMatrix (new_x, ctrl->flip_factor * 360); cob_mat = rot_mat * cob_mat; TransformNode (0, cob_mat, cob_mat.GetTransposed()); }