/* * Alternate view matrix generator: * Takes (X, Y, Z) rotation instead of a point to look at. * Generate rotational matrix by rotating a +Z-axis unit vector * around Y, then X and generating a view matrix for that target. * For now, Z rotation will be ignored. * Also generate an 'up' vector from a +Y-axis unit fector rotated by Y, then X. */ m4 look_at(v3 pos, v3 t_angles) { v4 unit_direction(0.0f, 0.0f, 1.0f, 1.0f); v4 up_direction(0.0f, 1.0f, 0.0f, 1.0f); m4 ry = rotate_y(t_angles.v[1]); unit_direction = ry * unit_direction; up_direction = ry * up_direction; m4 rx = rotate_x(t_angles.v[0]); unit_direction = rx * unit_direction; up_direction = rx * up_direction; v3 t_vec = pos + unit_direction; return look_at(pos, t_vec, up_direction); }
void getTrackInfo() { // Get track length TVector3 fit_position(m_fit[m_track->iTrack].pars[0], m_fit[m_track->iTrack].pars[1], m_fit[m_track->iTrack].pars[2]); TVector3 unit_direction (TMath::Sin(m_fit[m_track->iTrack].pars[3])*TMath::Cos(m_fit[m_track->iTrack].pars[4]), TMath::Sin(m_fit[m_track->iTrack].pars[3])*TMath::Sin(m_fit[m_track->iTrack].pars[4]), TMath::Cos(m_fit[m_track->iTrack].pars[3])); float t_const = -1e-10; float x_point = fit_position.x() + t_const * unit_direction.x(); float y_point = fit_position.y() + t_const * unit_direction.y(); float z_point = fit_position.z() + t_const * unit_direction.z(); TVector3 initial_position(x_point, y_point, z_point); float min_distance = 1e+30; float max_distance = -1e+30; float distance = 0.0; for (unsigned int iPoint = 0; iPoint < m_fit[m_track->iTrack].npoints; iPoint++){ TVector3 position (m_track->x[iPoint], m_track->y[iPoint], m_track->z[iPoint]); TVector3 position_vect = position - initial_position; distance = unit_direction * position_vect; if (distance < min_distance) min_distance = distance; if (distance > max_distance) max_distance = distance; } m_fit[m_track->iTrack].length = max_distance - min_distance; // Get impact parameters // x=0 x=end y=0 y=end float end_positions[4] = {0.0, 250.*80., 0.0, 50.*336.}; for (int iPos = 0; iPos < 4; iPos++){ t_const = 0.0; if ( iPos < 2 ) t_const = (end_positions[iPos]-fit_position.X())/unit_direction.X(); else t_const = (end_positions[iPos]-fit_position.Y())/unit_direction.Y(); // it might need to change if ( iPos < 2 ) m_fit[m_track->iTrack].impact_pars[iPos] = y_point; else m_fit[m_track->iTrack].impact_pars[iPos] = x_point; } }