Пример #1
0
/*
 * 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);
}
Пример #2
0
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; 
  } 
}