コード例 #1
0
ファイル: overworld.cpp プロジェクト: Benau/stk-code
/** Finds the starting position which is closest to the kart.
 *  \param kart The kart for which a rescue position needs to be determined.
 */
unsigned int OverWorld::getRescuePositionIndex(AbstractKart *kart)
{
    // find closest point to drop kart on
    const int start_spots_amount = getNumberOfRescuePositions();
    assert(start_spots_amount > 0);

    int closest_id = -1;
    float closest_distance = 999999999.0f;

    for (int n=0; n<start_spots_amount; n++)
    {
        const btTransform &s = getStartTransform(n);
        const Vec3 &v = s.getOrigin();

        float abs_distance = (v - kart->getXYZ()).length();

        if (abs_distance < closest_distance)
        {
            closest_distance = abs_distance;
            closest_id = n;
        }
    }

    assert(closest_id != -1);
    return closest_id;
}   // getRescuePositionIndex
コード例 #2
0
void Thread::optimizeManyPoints_MyParams(MatrixXd& constraints, int num_pts_between)
{
  MatrixXd myPoints(constraints.rows(), 3); //really just going to throw this out...but this gives us curve params
  vector<double> curvatures_resampled;
  vector<double> torsions_resampled;
  resamplePointsAndParams(myPoints, curvatures_resampled, torsions_resampled);
  Matrix4d start_transform;
  getStartTransform(start_transform);

  optimizeManyPoints(constraints, num_pts_between, curvatures_resampled, torsions_resampled, start_transform);
}
コード例 #3
0
ファイル: soccer_world.cpp プロジェクト: bog-dan-ro/stk-code
//-----------------------------------------------------------------------------
AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
                                int local_player_id, int global_player_id,
                                RaceManager::KartType kart_type,
                                PerPlayerDifficulty difficulty)
{
    int posIndex = index;
    int position = index+1;

    if(race_manager->getLocalKartInfo(index).getSoccerTeam() == SOCCER_TEAM_RED)
    {
        if(index % 2 != 1) posIndex += 1;
    }
    else
    {
        if(index % 2 != 0) posIndex += 1;
    }

    btTransform init_pos = getStartTransform(posIndex);

    AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
            difficulty);
    new_kart->init(race_manager->getKartType(index));
    Controller *controller = NULL;

    switch(kart_type)
    {
    case RaceManager::KT_PLAYER:
        controller = new LocalPlayerController(new_kart,
                          StateManager::get()->getActivePlayer(local_player_id),
                                         local_player_id);
        m_num_players ++;
        break;
    case RaceManager::KT_NETWORK_PLAYER:
        break;  // Avoid compiler warning about enum not handled.
        //controller = new NetworkController(kart_ident, position, init_pos,
        //                          global_player_id);
        //m_num_players++;
        //break;
    case RaceManager::KT_AI:
        controller = loadAIController(new_kart);
        break;
    case RaceManager::KT_GHOST:
        break;
    case RaceManager::KT_LEADER:
        break;
    }

    new_kart->setController(controller);

    return new_kart;
}   // createKart
コード例 #4
0
void Thread::getActualEndTangent(Vector3d& endTan)
{
  Matrix4d currTrans;
  getStartTransform(currTrans);
  currTrans.corner(Eigen::TopLeft,3,3) *= _length;
  ThreadPiece* currPiece = threadList;
  while (currPiece != NULL)
  {
    currTrans *= currPiece->_transform;
    currPiece = currPiece->_next_segment;
  }

  endTan = currTrans.corner(Eigen::TopLeft,3,1);
}
コード例 #5
0
/** Creates a kart, having a certain position, starting location, and local
 *  and global player id (if applicable).
 *  \param kart_ident Identifier of the kart to create.
 *  \param index Index of the kart.
 *  \param local_player_id If the kart is a player kart this is the index of
 *         this player on the local machine.
 *  \param global_player_id If the kart is a player kart this is the index of
 *         this player globally (i.e. including network players).
 */
AbstractKart *World::createKart(const std::string &kart_ident, int index,
                                int local_player_id, int global_player_id,
                                RaceManager::KartType kart_type,
                                PerPlayerDifficulty difficulty)
{
    unsigned int gk = 0;
    if (race_manager->hasGhostKarts())
        gk = ReplayPlay::get()->getNumGhostKart();

    int position           = index+1;
    btTransform init_pos   = getStartTransform(index - gk);
    AbstractKart *new_kart;
    if (RewindManager::get()->isEnabled())
        new_kart = new KartRewinder(kart_ident, index, position, init_pos,
                                    difficulty);
    else
        new_kart = new Kart(kart_ident, index, position, init_pos, difficulty);

    new_kart->init(race_manager->getKartType(index));
    Controller *controller = NULL;
    switch(kart_type)
    {
    case RaceManager::KT_PLAYER:
        controller = new LocalPlayerController(new_kart,
                         StateManager::get()->getActivePlayer(local_player_id));
        m_num_players ++;
        break;
    case RaceManager::KT_NETWORK_PLAYER:
        controller = new NetworkPlayerController(new_kart);
        m_num_players++;
        break;
    case RaceManager::KT_AI:
        controller = loadAIController(new_kart);
        break;
    case RaceManager::KT_GHOST:
        break;
    case RaceManager::KT_LEADER:
        break;
    case RaceManager::KT_SPARE_TIRE:
        break;
    }

    new_kart->setController(controller);

    return new_kart;
}   // createKart
コード例 #6
0
bool Thread::resamplePointsAndParams(MatrixXd& resampled_points, vector<double>& curvatures, vector<double>& torsions)
{
  curvatures.resize(resampled_points.rows());
  torsions.resize(resampled_points.rows());
  for (int i=0; i <curvatures.size(); i++)
  {
    curvatures[i] = torsions[i] = 0.0;
  }


	Matrix4d first_trans;
  getStartTransform(first_trans);
  first_trans.corner(Eigen::TopLeft,3,3)*= _length;
	threadList->getPointsAndParams(resampled_points, 0.0, 1.0/((double)resampled_points.rows()-1), 0, first_trans, curvatures, torsions); 

/*
  for (int i=0; i < resampled_points.rows(); i++)
  {
    std::cout << "curvature: " << curvatures[i] << "      torsion: " << torsions[i] << std::endl;
  }
*/
}
コード例 #7
0
ファイル: world_with_rank.cpp プロジェクト: Benau/stk-code
unsigned int WorldWithRank::getRescuePositionIndex(AbstractKart *kart)
{
    const int start_spots_amount = getTrack()->getNumberOfStartPositions();
    assert(start_spots_amount > 0);

    float largest_accumulated_distance_found = -1;
    int   furthest_id_found                  = -1;

    for(int n=0; n<start_spots_amount; n++)
    {
        const btTransform &s = getStartTransform(n);
        const Vec3 &v=s.getOrigin();
        float accumulated_distance = .0f;
        bool spawn_point_clear = true;

        for(unsigned int k=0; k<getCurrentNumKarts(); k++)
        {
            if(kart->getWorldKartId()==k) continue;
            float abs_distance2 = (getKart(k)->getXYZ()-v).length2();
            const float CLEAR_SPAWN_RANGE2 = 5*5;
            if( abs_distance2 < CLEAR_SPAWN_RANGE2)
            {
                spawn_point_clear = false;
                break;
            }
            accumulated_distance += sqrt(abs_distance2);
        }

        if(accumulated_distance > largest_accumulated_distance_found &&
            spawn_point_clear)
        {
            furthest_id_found = n;
            largest_accumulated_distance_found = accumulated_distance;
        }
    }

    assert(furthest_id_found != -1);
    return furthest_id_found;
}   // getRescuePositionIndex
コード例 #8
0
ファイル: world.cpp プロジェクト: rugk/stk-code
/** Creates a kart, having a certain position, starting location, and local
 *  and global player id (if applicable).
 *  \param kart_ident Identifier of the kart to create.
 *  \param index Index of the kart.
 *  \param local_player_id If the kart is a player kart this is the index of
 *         this player on the local machine.
 *  \param global_player_id If the kart is a player kart this is the index of
 *         this player globally (i.e. including network players).
 */
AbstractKart *World::createKart(const std::string &kart_ident, int index,
                                int local_player_id, int global_player_id,
                                RaceManager::KartType kart_type,
                                const PlayerDifficulty *difficulty)
{
    int position           = index+1;
    btTransform init_pos   = getStartTransform(index);
    AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
                                      difficulty);
    new_kart->init(race_manager->getKartType(index));
    Controller *controller = NULL;
    switch(kart_type)
    {
    case RaceManager::KT_PLAYER:
        controller = new PlayerController(new_kart,
                         StateManager::get()->getActivePlayer(local_player_id),
                                          local_player_id);
        m_num_players ++;
        break;
    case RaceManager::KT_NETWORK_PLAYER:
        controller = new NetworkPlayerController(new_kart,
                        StateManager::get()->getActivePlayer(local_player_id));
        m_num_players++;
        break;
    case RaceManager::KT_AI:
        controller = loadAIController(new_kart);
        break;
    case RaceManager::KT_GHOST:
        break;
    case RaceManager::KT_LEADER:
        break;
    }

    new_kart->setController(controller);

    return new_kart;
}   // createKart
コード例 #9
0
ファイル: profile_world.cpp プロジェクト: bog-dan-ro/stk-code
/** Creates a kart, having a certain position, starting location, and local
 *  and global player id (if applicable).
 *  \param kart_ident Identifier of the kart to create.
 *  \param index Index of the kart.
 *  \param local_player_id If the kart is a player kart this is the index of
 *         this player on the local machine.
 *  \param global_player_id If the akrt is a player kart this is the index of
 *         this player globally (i.e. including network players).
 *  \param init_pos The start XYZ coordinates.
 */
AbstractKart *ProfileWorld::createKart(const std::string &kart_ident, int index,
                                       int local_player_id, int global_player_id,
                                       RaceManager::KartType type,
                                       PerPlayerDifficulty difficulty)
{
    btTransform init_pos   = getStartTransform(index);

    Kart *new_kart         = new KartWithStats(kart_ident,
                                               /*world kart id*/ index,
                                               /*position*/ index+1,
                                               init_pos, difficulty);
    new_kart->init(RaceManager::KT_AI);
    Controller *controller = loadAIController(new_kart);
    new_kart->setController(controller);

    // Create a camera for the last kart (since this way more of the
    // karts can be seen.
    if (index == (int)race_manager->getNumberOfKarts()-1)
    {
        // The camera keeps track of all cameras and will free them
        Camera::createCamera(new_kart);
    }
    return new_kart;
}   // createKart
コード例 #10
0
void Thread::optimizeManyPoints(MatrixXd& constraints, int num_pts_between, vector<double>&curvatures_resampled, vector<double>& torsions_resampled, Matrix4d& start_transform)
{
  int num_constraints = constraints.rows()-1;
  int num_pieces_reopt = num_pts_between*num_constraints;
  double length_per_piece = 1.0/( num_pieces_reopt);
  
  //opt_params_many_points.transform_back = _transform_to_start;
  opt_params_many_points.num_segments = num_pieces_reopt;
  opt_params_many_points.length_per_segment = length_per_piece;


  opt_params_many_points.points.resize(num_constraints);
  opt_params_many_points.orig_params_each_piece = new NEWMAT::ColumnVector(2*num_pieces_reopt+3);
  opt_params_many_points.num_pts_between = num_pts_between;

  opt_params_many_points.gravity_multipler = (GRAVITY_CONSTANT)*_length;
  opt_params_many_points.total_length = _length;


  for (int i=0; i < num_constraints; i++)
  {
    for (int j=0; j < num_pts_between; j++)
    {
      int piece_num = i*num_pts_between+j;
      opt_params_many_points.orig_params_each_piece->element(2*piece_num) = curvatures_resampled[i];
      opt_params_many_points.orig_params_each_piece->element(2*piece_num+1) = torsions_resampled[i];
    }
  }

  

  double eulerZ, eulerY, eulerX;
  eulerAnglesFramTransform(start_transform.corner(Eigen::TopLeft,3,3), eulerZ, eulerY, eulerX);
  opt_params_many_points.orig_params_each_piece->element(2*num_pieces_reopt) = eulerZ;
  opt_params_many_points.orig_params_each_piece->element(2*num_pieces_reopt+1) = eulerY;
  opt_params_many_points.orig_params_each_piece->element(2*num_pieces_reopt+2) = eulerX;

  for (int i=0; i < num_constraints; i++)
  {
    opt_params_many_points.points[i] = ((constraints.block((i+1),0,1,3) - constraints.block(0,0,1,3))/_length).transpose();
  }


  NEWMAT::ColumnVector x_sol;

  optimize_FDNLF(2*opt_params_many_points.num_segments+3, energyEvalFunctionManyPoints, energyEvalFunctionManyPoints_init, x_sol);


  std::cout << "done re-optimizing" << std::endl;
  delete opt_params_many_points.orig_params_each_piece;

 
  //set thread params
  _positions[0] = constraints.block(0,0,1,3).transpose();
  transformFromEulerAngles(_transform_to_start, x_sol(2*num_pieces_reopt+1), x_sol(2*num_pieces_reopt+2));
	_translate_to_start = Matrix4d::Identity();
  _translate_to_start.corner(Eigen::TopRight,3,1) = _positions[0];

  _tangents[0] = _transform_to_start.corner(Eigen::TopLeft,3,1);
  //_tangents[0] = orig_thread->_tangents[0];

  _angle_first_rot = x_sol(2*num_pieces_reopt+3);

	inverseTransform(_transform_to_start, _transform_to_unit);



  Matrix4d transform_back;
  getStartTransform(transform_back);
  transform_back.corner(Eigen::TopLeft,3,3) *= _length;
  threadList = new ThreadPiece(x_sol(1), x_sol(2), length_per_piece);
  ThreadPiece* currPiece = threadList;
  for (int i=1; i < num_pieces_reopt; i++)
  {
    currPiece->addSegmentAfter(new ThreadPiece(x_sol(2*i+1), x_sol(2*i+2), length_per_piece));
    transform_back *= currPiece->_transform;
    currPiece = currPiece->_next_segment;
  }

  //_positions[1] = transform_back.corner(Eigen::TopRight,3,1);
 // _positions[1] = orig_thread->_positions[1];
 // _tangents[1] = orig_thread->_tangents[1];
 // _tangents[1].normalize();
 // _tangents[0].normalize();

  _positions[1] = transform_back.corner(Eigen::TopRight,3,1);
  _tangents[1] = transform_back.corner(Eigen::TopLeft,3,1);
  _tangents[1].normalize();

  //printThreadInfo();



}
コード例 #11
0
//-----------------------------------------------------------------------------
AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
                                int local_player_id, int global_player_id,
                                RaceManager::KartType kart_type,
                                PerPlayerDifficulty difficulty)
{
    int cur_red = getTeamNum(SOCCER_TEAM_RED);
    int cur_blue = getTeamNum(SOCCER_TEAM_BLUE);
    int pos_index = 0;
    int position  = index + 1;
    SoccerTeam team = SOCCER_TEAM_BLUE;

    if (kart_type == RaceManager::KT_AI)
    {
        if (index < m_red_ai)
            team = SOCCER_TEAM_RED;
        else
            team = SOCCER_TEAM_BLUE;
        m_kart_team_map[index] = team;
    }
    else
    {
        int rm_id = index -
            (race_manager->getNumberOfKarts() - race_manager->getNumPlayers());

        assert(rm_id >= 0);
        team = race_manager->getKartInfo(rm_id).getSoccerTeam();
        m_kart_team_map[index] = team;
    }

    // Notice: In blender, please set 1,3,5,7... for blue starting position;
    // 2,4,6,8... for red.
    if (team == SOCCER_TEAM_BLUE)
    {
        pos_index = 1 + 2 * cur_blue;
    }
    else
    {
        pos_index = 2 + 2 * cur_red;
    }

    btTransform init_pos = getStartTransform(pos_index - 1);
    m_kart_position_map[index] = (unsigned)(pos_index - 1);

    AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
              difficulty);
            //difficulty, team == SOCCER_TEAM_BLUE ?
            //video::ERT_BLUE : video::ERT_RED);
    new_kart->init(race_manager->getKartType(index));
    Controller *controller = NULL;

    switch(kart_type)
    {
    case RaceManager::KT_PLAYER:
        controller = new LocalPlayerController(new_kart,
                          StateManager::get()->getActivePlayer(local_player_id));
        m_num_players ++;
        break;
    case RaceManager::KT_NETWORK_PLAYER:
        break;  // Avoid compiler warning about enum not handled.
        //controller = new NetworkController(kart_ident, position, init_pos,
        //                          global_player_id);
        //m_num_players++;
        //break;
    case RaceManager::KT_AI:
        controller = loadAIController(new_kart);
        break;
    case RaceManager::KT_GHOST:
        break;
    case RaceManager::KT_LEADER:
        break;
    }

    new_kart->setController(controller);

    return new_kart;
}   // createKart