/**
   * setLinkStatus
   *
   * <p>Debugようにこのメソッドを叩くと現在のRobotの状態をIntegratorに通知する
   *
   * @param objectName
   */
  private void _setLinkStatus(String objectName) {
    if (robot_ == null) robot_ = (GrxModelItem) manager_.getItem(GrxModelItem.class, objectName);

    TransformGroup tg = robot_.getTransformGroupRoot();
    Transform3D t3d = new Transform3D();
    tg.getTransform(t3d);
    Vector3d pos = new Vector3d();
    Matrix3d mat = new Matrix3d();
    t3d.get(mat, pos);

    double[] value = new double[12];
    pos.get(value);
    value[3] = mat.m00;
    value[4] = mat.m01;
    value[5] = mat.m02;
    value[6] = mat.m10;
    value[7] = mat.m11;
    value[8] = mat.m12;
    value[9] = mat.m20;
    value[10] = mat.m21;
    value[11] = mat.m22;

    integrator_.setCharacterLinkData(
        objectName, robot_.rootLink().getName(), LinkDataType.ABS_TRANSFORM, value);
    integrator_.setCharacterAllLinkData(
        objectName, LinkDataType.JOINT_VALUE, robot_.getJointValues());
    integrator_.calcCharacterForwardKinematics(objectName);
  }
  /**
   * resolve
   *
   * <p>マウスの動きから生成された T3D を逆運動学サーバを使って 各ジョイントの動きに直し設定する
   *
   * @param transform
   * @return
   */
  public boolean resolve(Transform3D transform) {
    _setLinkStatus(robot_.getName());

    Matrix3d m3d = new Matrix3d();
    Vector3d v3d = new Vector3d();
    transform.get(m3d, v3d);

    v3d.get(tr.p);
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        tr.R[3 * i + j] = m3d.getElement(i, j);
      }
    }
    try {
      if (robot_ == null || from_ == null || to_ == null) return false;

      if (!integrator_.calcCharacterInverseKinematics(
          robot_.getName(), from_.getName(), to_.getName(), tr)) {
        System.out.println("ik failed.");
        robot_.calcForwardKinematics();
        return false;
      }
      ;
    } catch (Exception e) {
      e.printStackTrace();
    }

    DblSequenceHolder v = new DblSequenceHolder();
    integrator_.getCharacterAllLinkData(robot_.getName(), LinkDataType.JOINT_VALUE, v);
    robot_.setJointValues(v.value);
    robot_.setJointValuesWithinLimit();
    robot_.updateInitialJointValues();
    _setRootJoint(robot_);
    robot_.calcForwardKinematics();

    return true;
  }