コード例 #1
0
void load_callback(Fl_Button *button, void *) 
{
  if(button == loadSkeleton_button)
    if (lastSkeleton <= lastMotion)  // cannot load new skeleton until motion is assigned to the current skeleton
    {
      char * filename = fl_file_chooser("Select filename","*.ASF","");
      if(filename != NULL)
      {
        // Read skeleton from asf file
        pSkeleton = new Skeleton(filename, MOCAP_SCALE);
        lastSkeleton++;
        // Set the rotations for all bones in their local coordinate system to 0
        // Set root position to (0, 0, 0)
        pSkeleton->setBasePosture();
        displayer.LoadSkeleton(pSkeleton);
        glwindow->redraw();
      }
    }

  if(button == loadMotion_button)
  {
    if ((lastSkeleton >= 0) && (lastSkeleton >= lastMotion))
    {
      char * filename = fl_file_chooser("Select filename","*.AMC","");
      if(filename != NULL)
      {
        // Read motion (.amc) file and create a motion
        pMotion = new Motion(filename, MOCAP_SCALE, pSkeleton);

        // backup the filename
        strcpy(lastMotionFilename, filename);

        // set sampled motion for display
        displayer.LoadMotion(pMotion);      
        if (lastSkeleton > lastMotion)         
          lastMotion++;
        
        UpdateMaxFrameNumber();
        resetPostureAccordingFrameSlider();
        frame_slider->value(currentFrameIndex);
        frame_slider->maximum((double)maxFrames);
        frame_slider->redraw();
        glwindow->redraw();
        Fl::flush();
      }
    } // if (lastSkeleton > lastMotion)
  }
  glwindow->redraw();
}
コード例 #2
0
void reload_callback(Fl_Button *button, void *) 
{
  if (!displayer.GetNumSkeletons())
    return;

  // Read motion (.amc) file and create a motion
  pMotion = new Motion(lastMotionFilename, MOCAP_SCALE, pSkeleton);

  // Set sampled motion for display
  displayer.LoadMotion(pMotion);
  
  resetPostureAccordingFrameSlider();
  UpdateMaxFrameNumber();
  frame_slider->maximum((double)maxFrames);
  frame_slider->value(currentFrameIndex);
  frame_slider->redraw();
  Fl::flush();
  glwindow->redraw();
}
コード例 #3
0
int main(int argc, char **argv) 
{
  // Initialize form, sliders and buttons
  form = make_window();

  performanceCounter.StartCounter();  // init
  saveFileTimeCounter.StartCounter(); // init

  groundPlane_button->value(groundPlane);
  fog_button->value(useFog);
  worldAxes_button->value(renderWorldAxes);
  frame_slider->value(1);
  if (saveScreenToFile == SAVE_CONTINUOUS)
    record_button->value(1);  // ON
  else
    record_button->value(0);  // OFF

  // just do some timing, no special purpose
  // because the first data is always not trustable according to experience
  performanceCounter.StopCounter(); 
  performanceCounter.GetElapsedTime();
  saveFileTimeCounter.StopCounter();
  saveFileTimeCounter.GetElapsedTime();
  performanceCounter.StartCounter();
  // show form, and do initial draw of model
  form->show();
  glwindow->show(); // glwindow is initialized when the form is built
  performanceCounter.StopCounter();

  if (argc > 2)
  {
    char *filename;

    filename = argv[1];
    if(filename != NULL)
    {
      //Read skeleton from asf file
      pSkeleton = new Skeleton(filename, MOCAP_SCALE);

      //Set the rotations for all bones in their local coordinate system to 0
      //Set root position to (0, 0, 0)
      pSkeleton->setBasePosture();
      displayer.LoadSkeleton(pSkeleton);
      lastSkeleton++;
    }

    if (displayer.GetNumSkeletons())
    {
      filename = argv[2];
      if(filename != NULL)
      {
        //Read motion (.amc) file and create a motion
        pMotion = new Motion(filename, MOCAP_SCALE,pSkeleton);

        //set sampled motion for display
        displayer.LoadMotion(pMotion);               
        
        lastMotion++;

        //Tell skeleton to perform the first pose ( first posture )
        pSkeleton->setPosture(*(displayer.GetSkeletonMotion(0)->GetPosture(0)));          

        // Set skeleton to perform the first pose ( first posture )         
        int currentFrames = displayer.GetSkeletonMotion(0)->GetNumFrames();
        if (currentFrames > maxFrames)
        {
          maxFrames = currentFrames;
          frame_slider->maximum((double)maxFrames);

        }
        frame_slider->maximum((double)maxFrames);

        currentFrameIndex=0;
      } // if(filename != NULL)
    }
    else
      printf("Load a skeleton first.\n");
    framesIncrementDoublePrecision = 1.0;            // Current frame and frame increment
    playButton = ON;
    repeatButton = OFF;
    groundPlane = ON; 
    glwindow->redraw();
  }  // if (argc > 2)
  Fl::add_idle(idle);
  return Fl::run();
}
コード例 #4
0
int main(int argc, char** argv)
{
    // init frame dimensions and buffer
    width = windowWidth;//800;
    height = windowHeight;//600;
    pixels = new unsigned char[3*width*height];

    if(argc==3)
    {
        currentFrameIndex = atoi(argv[1]);
        maxFrameIndex = atoi(argv[2]);
    }


    // init camera
    fovy = 65;
    nearz = 1;
    neary = nearz * tan(fovy/2 * (PI/180));
    nearx = neary * ((float)width/(float)height);
    eye = Vector3(-5, 1, -5);
    focus= Vector3(0, 1, 0);
    up = Vector3(0, 1, 0);

    // init scene objects
    numObjects = 0;
    boneIndex=-1;
    objsPerBone=0;
    // spheres
    numSpheres=0;
    spheres[numSpheres] = new Sphere(Vector3(0, -1000, 0), 1000, Vector3(0.5, 0.5, 0.5), MAT_DIFFUSE);
    objects[numObjects++] = spheres[numSpheres++];
    spheres[numSpheres] = new Sphere(Vector3(-1.5, 2, 3), 0.2, Vector3(0, 0, 1), MAT_DIFFUSE);
    objects[numObjects++] = spheres[numSpheres++];
    //cylinders
    numCylinders=0;
    Matrix3 rot = getRotationMatrix(90, 1, 0, 0);
    cylinders[numCylinders]= new Cylinder(Vector3(-1.5, 0.5, 3), 0.2, 1.5, rot, Vector3(0, 0, 1), MAT_DIFFUSE);
    objects[numObjects++] = cylinders[numCylinders++];
    cylinders[numCylinders]= new Cylinder(Vector3(-1.5, 2, 3), 0.005, 2, rot, Vector3(0.8, 0.8, 0.8), MAT_DIFFUSE);
    objects[numObjects++] = cylinders[numCylinders++];
    // dumbells
    float l = 0.35;
    Vector3 pos = Vector3(-3, 0.07, 3);
    rot = getRotationMatrix(120, 0, 1, 0);
    spheres[numSpheres] = new Sphere(pos, 0.07, Vector3(0.2, 0.2, 0.2), MAT_DIFFUSE);
    objects[numObjects++] = spheres[numSpheres++];
    spheres[numSpheres] = new Sphere(pos+(rot*Vector3(0, 0, l)), 0.07, Vector3(0.2, 0.2, 0.2), MAT_DIFFUSE);
    objects[numObjects++] = spheres[numSpheres++];
    cylinders[numCylinders]= new Cylinder(pos, 0.02, l, rot, Vector3(0.2, 0.2, 0.2), MAT_DIFFUSE);
    objects[numObjects++] = cylinders[numCylinders++];
    
    pos = Vector3(-3.5, 0.07, 3.4);
    rot = getRotationMatrix(170, 0, 1, 0);
    spheres[numSpheres] = new Sphere(pos, 0.07, Vector3(0.2, 0.2, 0.2), MAT_DIFFUSE);
    objects[numObjects++] = spheres[numSpheres++];
    spheres[numSpheres] = new Sphere(pos+(rot*Vector3(0, 0, l)), 0.07, Vector3(0.2, 0.2, 0.2), MAT_DIFFUSE);
    objects[numObjects++] = spheres[numSpheres++];
    cylinders[numCylinders]= new Cylinder(pos, 0.02, l, rot, Vector3(0.2, 0.2, 0.2), MAT_DIFFUSE);
    objects[numObjects++] = cylinders[numCylinders++];

    //triangles
    numTriangles=0;
    Vector3 ah = Vector3( 2, 3,  5); Vector3 al = Vector3( 2, 0,  5);
    Vector3 bh = Vector3(-5, 3,  5); Vector3 bl = Vector3(-5, 0,  5);
    Vector3 ch = Vector3( 2, 3, -2); Vector3 cl = Vector3( 2, 0, -2);
    Vector3 dh = Vector3(-5, 3, -2); Vector3 dl = Vector3(-5, 0, -2);
    triangles[numTriangles] = new Triangle(ah, bh, al, Vector3(0, 0, 1), 0, 0, 1, 0, 0, 1);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(bh, al, bl, Vector3(0, 0, 1), 1, 0, 0, 1, 1, 1);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(bh, dh, bl, Vector3(0.5, 0.5, 0.5),MAT_REFLECT);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(dh, bl, dl, Vector3(0.5, 0.5, 0.5),MAT_REFLECT);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(ch, ah, cl, Vector3(1, 0, 1), 0, 0, 1, 0, 0, 1);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(ah, cl, al, Vector3(1, 0, 1), 1, 0, 0, 1, 1, 1);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(dh, ch, dl, Vector3(1, 1, 0), 0, 0, 1, 0, 0, 1);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(ch, dl, cl, Vector3(1, 1, 0), 1, 0, 0, 1, 1, 1);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(ah, bh, ch, Vector3(0.75, 0.75, 0.75),MAT_DIFFUSE);
    objects[numObjects++] = triangles[numTriangles++];
    triangles[numTriangles] = new Triangle(bh, ch, dh, Vector3(0.75, 0.75, 0.75),MAT_DIFFUSE);
    objects[numObjects++] = triangles[numTriangles++];
    // lights
    numLights=0;
    lights[numLights++] = new Light(Vector3(1, 2, -1), Vector3(0.5, 0.5, 0.5), 
				    Vector3(1.0f, 0.0f, 0.0f), Vector3(0.0f, 0.0f, 1.0f), 1, 1, 0.05f);
    lights[numLights++] = new Light(Vector3(-1, 2.9, -1), Vector3(0.5, 0.5, 0.5), 
				    Vector3(1.0f, 0.0f, 0.0f), Vector3(0.0f, 0.0f, 1.0f), 1, 1, 0.05f);
    
    // GLUT functions
  glutInit(&argc, argv);
  glutInitWindowSize(windowWidth,windowHeight);
  glutInitWindowPosition(100, 100);
  glutCreateWindow("CS 180, Final Project");
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutDisplayFunc(display);
  glutKeyboardFunc(keyboard);
  glutIdleFunc(idle);
  
  // load up Kim's skeleton stuff
  string skeletonFilename("01.asf");
  string motionFilename("01_02.amc");
  skeleton = new Skeleton(skeletonFilename.c_str(), MOCAP_SCALE);
  skeleton->setBasePosture();
  displayer.LoadSkeleton(skeleton);
  motion = new Motion(motionFilename.c_str(), MOCAP_SCALE, skeleton);
  displayer.LoadMotion(motion);
  skeleton->setPosture(*(displayer.GetSkeletonMotion(0)->GetPosture(0)));
  // load up the next motion capture frame
  SetSkeletonsToSpecifiedFrame(currentFrameIndex);

  glutMainLoop();

  return 0;
}