void
Skin0::createGeometries(ArRef<Skeleton> skeleton)
{
cout<<"Nb joints "<<skeleton->getNbJoints()<<endl;
for (unsigned int i(0);i<skeleton->getNbJoints();++i)
  {
  ArRef<Joint> joint = skeleton->accessJoint(i);
  cout<<"joint "<<joint->getName()<<endl;
  ArConstRef<Joint> parent = joint->getParent();
  if (parent.valid())
    { cout<<" -> parent is "<<parent->getName()<<endl; }
  else
    { cout<<" -> no parent"<<endl; }

  ArRef<Object3D> object = Object3D::NEW();
  object->setLocation(joint);
  object->attachTo(joint);
  ArRef<Sphere3D> sphere = Sphere3D::NEW();
  sphere->setRadius(0.1);
  ArRef<Shape3D> shape = Shape3D::NEW();
  shape->addRootPart(sphere);
  object->setShape(shape); 
  _objects.push_back(object);
  cout<<"skin New object"<<endl;
  }
}
bool
ArTrackSpiral::_readXML(ArRef<XmlNode> node)
{
if(!ArKeyFrameTrack::_readXML(node))
  return(false);
  
if (node->getName()=="TrackSpiral")
  {
  node->getPropertyReal("vx",_axis.accessVector()[0]);
  node->getPropertyReal("vy",_axis.accessVector()[1]);
  node->getPropertyReal("vz",_axis.accessVector()[2]);
  
  node->getPropertyReal("ox",_offset.accessVector()[0]);
  node->getPropertyReal("oy",_offset.accessVector()[1]);
  node->getPropertyReal("oz",_offset.accessVector()[2]);
  }
else
  {
  _offset=Vector3d(0,0,0);
  _axis=Vector3d(1,0,0);
  }
  
return(true);
}
bool
ArTrackOrientation::_readXML(ArRef<XmlNode> node)
{
if (node->getName()!="TrackOrientation")
  return(ArKeyFrameTrack::_readXML(node));
  
double duration;
int degree;
node->getPropertyReal("duration",duration);
node->getPropertyInteger("degree",degree);
_track->setDuration(duration);
_track->setDegree(degree);

int dim;
if (!node->getPropertyInteger("dimension",dim))
  {
  cerr << "Missing dimensions specification" << endl;
  return(false);
  }
if (dim!=4)
  {
  cerr << "Bad track dimension " << dim << "!=4" << endl;
  return(false);
  }
  
_track->clearKeyFrames();
    
ArRef<XmlNode> keyFrame=node->getFirstChild();   
while(keyFrame)
  {
  if (keyFrame->getName()=="KeyFrameOrientation")
    {
    int frame;
    if (!keyFrame->getPropertyInteger("frame",frame))
      {
      cerr << "Invalid keyFrame misssing frame info"<< endl;
      return(false);
      }
      
    
    double angle;
    double xx,yy,zz;
    bool ok=true;
    if(!keyFrame->getPropertyReal("vx",xx))
      ok = false;
    if(!keyFrame->getPropertyReal("vy",yy))
      ok = false;
    if(!keyFrame->getPropertyReal("vz",zz))
      ok = false;
    if(!keyFrame->getPropertyReal("angle",angle))
      ok = false;
    
    if(!ok)
    {
        cerr << "Error reading orientation infos (vx,vy,vz,angle)" << endl;
        return(false);
    }
    
    Vector3d axis(xx,yy,zz);
    
/*    if (!keyFrame->getPropertyReal("vx",axis.accessVector()[0]) ||
        !keyFrame->getPropertyReal("vy",axis.accessVector()[1]) ||
        !keyFrame->getPropertyReal("vz",axis.accessVector()[2]) ||
        !keyFrame->getPropertyReal("angle",angle))
               
       {
        cerr << "Error reading orientation infos (vx,vy,vz,angle)" << endl;
        return(false);
       }*/
    
    setKeyFrame(frame,axis,angle);
    //cerr << "kf=" << frame << "   axis=" << axis << "   angme=" << angle << endl;
    }
  keyFrame=keyFrame->getNext();
  }
return(true);
}