private static DOF HumanDOF(Bone key, bool mirror) { DOF dof; switch (key) { //第三截手指 case Bone.thumb3_l: case Bone.index3_l: case Bone.middle3_l: case Bone.ring3_l: case Bone.pinky3_l: dof = finger(2); break; //第二截手指 case Bone.thumb2_l: dof = DOF.Ball(-20, +20, -80, +40); break; case Bone.index2_l: case Bone.middle2_l: case Bone.ring2_l: case Bone.pinky2_l: dof = finger(1); break; //第一截手指 case Bone.thumb1_l: dof = DOF.Ball(-15, +15, -30, +15); break; case Bone.index1_l: dof = DOF.Hinge(-100, 0); break; case Bone.middle1_l: case Bone.ring1_l: case Bone.pinky1_l: dof = finger(0); break; //掌骨(固定) case Bone.palm1_l: case Bone.palm2_l: case Bone.palm3_l: case Bone.palm4_l: dof = new DOF(); break; //四肢 case Bone.hand_l: dof = DOF.Ball(-25, +55, -90, +90); break; case Bone.forearm_l: dof = DOF.Hinge2D(-150, +0, -145, +10); break; case Bone.upperarm_l: dof = DOF.Ball3D(-140, +40, -135, +90, -90, +90); break; case Bone.shoulder_l: dof = DOF.Ball(-20, +20, -20, +20); break; case Bone.head: dof = DOF.Hinge(-35, +40); break; case Bone.neck: dof = DOF.Ball3D(-55, +55, -50, +60, -70, +70); break; case Bone.chest: dof = DOF.Ball3D(-25, +25, -15, +40, -40, +40); break; case Bone.spine: dof = DOF.Ball3D(-25, +25, -15, +40, -40, +40); break; case Bone.heel2_l: dof = new DOF(); break; case Bone.heel1_l: dof = new DOF(); break; case Bone.toe_l: dof = DOF.Hinge(-40, +50); break; case Bone.foot_l: dof = DOF.Ball(-35, +20, -45, +20); break; case Bone.shin_l: dof = DOF.Hinge(0, 150); break; //case HumanSkeleton.thigh: dof = DOF.Ball3D( -25, +125, -25, +45, -45, +45); dof.Offset(15, 180, 180); break; case Bone.thigh_l: dof = DOF.Hinge(-125, +25); break; case Bone.hips: dof = new DOF(); break; case Bone.root: dof = new DOF(); break; case Bone.other: dof = DOF.NoLimit; break; default: if (!mirror) //first time goto left bones(guess is a right bone) { return(HumanDOF(key - 1, true)); //second time come to default will fail to else } else { throw new Exception("unknown HumanSkeleton"); } } return(dof); }