示例#1
0
//--------------------------------------------------------------
// create the intro track
void Intro::initTrack()
{
  const double TRACK_RADIUS = 50.0;
  const int TRACK_POINTS = 12;
  const double CNTL_LEN = 2*TRACK_RADIUS/TRACK_POINTS;

  mgPoint3 points[TRACK_POINTS+2];

  // create simple circular track
  for (int i = 0; i <= TRACK_POINTS+1; i++)
  {
    double lenAngle = (2*PI*i)/TRACK_POINTS;

    mgPoint3* pt = &points[i];
    pt->x = m_origin.x + TRACK_RADIUS * cos(lenAngle);
    pt->x -= TRACK_RADIUS;  // 0,0,0 is start position
    pt->y = m_origin.y + 2*sin(5*(2*PI*i)/TRACK_POINTS);
    pt->z = m_origin.z + TRACK_RADIUS * sin(lenAngle);
  }

  // build first point of spline
  mgPoint3 pt, lastPt, nextPt;
  pt = points[0];
  lastPt = points[TRACK_POINTS-1];
  nextPt = points[1];

  mgPoint3 cntlPt(pt);
  cntlPt.subtract(lastPt);
  cntlPt.add(nextPt);
  cntlPt.subtract(pt);
  cntlPt.scale(0.125);
  cntlPt.add(pt);

  mgBezier* wallTrack = new mgBezier();
  mgBezier* tubeTrack = new mgBezier();
  wallTrack->addVertex(pt, cntlPt);
  tubeTrack->addVertex(pt, cntlPt);

  // build remaining points of spline
  for (int i = 1; i <= TRACK_POINTS; i++)
  {
    mgPoint3 pt = points[i];
    mgPoint3 lastPt = points[i-1];
    mgPoint3 nextPt = points[i+1];

    mgPoint3 cntlPt(pt);
    cntlPt.subtract(lastPt);
    cntlPt.add(nextPt);
    cntlPt.subtract(pt);
    cntlPt.scale(-0.125);
    cntlPt.add(pt);

    wallTrack->addVertex(pt, cntlPt);
    tubeTrack->addVertex(pt, cntlPt);
  }

  m_tube->setTrack(tubeTrack);
  m_wall->setTrack(wallTrack);
}
示例#2
0
//--------------------------------------------------------------------
// initialize the track
void DontHitMe::initTrack()
{
  m_tube = new Tube(TUBE_RADIUS, TUBE_STEPS);

  const double TRACK_RADIUS = 350.0;
  const int TRACK_POINTS = 12;
  const double CNTL_LEN = 2*TRACK_RADIUS/TRACK_POINTS;

  mgPoint3 points[TRACK_POINTS+2];

  // create simple circular track
  for (int i = 0; i <= TRACK_POINTS+1; i++)
  {
    double lenAngle = (2*PI*i)/TRACK_POINTS;

    mgPoint3* pt = &points[i];
    pt->x = TRACK_RADIUS * cos(lenAngle);
    pt->y = 60*sin(5*(2*PI*i)/TRACK_POINTS);
    pt->z = TRACK_RADIUS * sin(lenAngle);
  }

  // build first point of spline
  mgPoint3 pt, lastPt, nextPt;
  pt = points[0];
  lastPt = points[TRACK_POINTS-1];
  nextPt = points[1];

  mgPoint3 cntlPt(pt);
  cntlPt.subtract(lastPt);
  cntlPt.add(nextPt);
  cntlPt.subtract(pt);
  cntlPt.scale(0.125);
  cntlPt.add(pt);

  mgBezier* track = new mgBezier();
  track->addVertex(pt, cntlPt);

  // build remaining points of spline
  for (int i = 1; i <= TRACK_POINTS; i++)
  {
    mgPoint3 pt = points[i];
    mgPoint3 lastPt = points[i-1];
    mgPoint3 nextPt = points[i+1];

    mgPoint3 cntlPt(pt);
    cntlPt.subtract(lastPt);
    cntlPt.add(nextPt);
    cntlPt.subtract(pt);
    cntlPt.scale(-0.125);
    cntlPt.add(pt);

    track->addVertex(pt, cntlPt);
  }

  m_tube->setTrack(track);
}