public static void addCube(
      double cubeX, double cubeY, double cubeSize, Color color, SimulationConstructionSet scs) {
    final double CUBE_HEIGHT = 0.001;
    // Make cubes a tiny bit smaller so they don't blend together.
    cubeSize *= 0.9;

    Graphics3DObject linkGraphics = new Graphics3DObject();
    linkGraphics.translate(new Vector3d(cubeX, cubeY, CUBE_HEIGHT));
    linkGraphics.addCube(
        cubeSize, cubeSize, cubeSize, new YoAppearanceRGBColor(new Color3f(color), 0.0));

    scs.addStaticLinkGraphics(linkGraphics);
  }
  /** *********************** SCS ROBOT - Links ******************************* */
  private void createAndAttachBodyLink(LinkNames linkName) {
    Link link = new Link(LinkNames.BODY_LINK.getName());
    Matrix3d inertiaBody = createInertiaMatrixBox(linkName);
    link.setMomentOfInertia(inertiaBody);
    link.setMass(RobotParameters.MASSES.get(LinkNames.BODY_LINK));
    link.setComOffset(comOffsetBody);

    Graphics3DObject linkGraphics = new Graphics3DObject();
    linkGraphics.addCube(cubeX, cubeY, cubeZ, RobotParameters.APPEARANCE.get(LinkNames.BODY_LINK));
    link.setLinkGraphics(linkGraphics);
    //      link.addEllipsoidFromMassProperties(YoAppearance.Green());
    link.addCoordinateSystemToCOM(0.7);
    bodyJointSCS.setLink(link);
  }
  private void createAndAttachFootLink(
      LinkNames linkName, JointNames jointName, RobotSide robotSide) {
    Link link = new Link(LinkNames.FOOT_LINK.getName());
    Matrix3d inertiaFoot = createInertiaMatrixBox(linkName);
    link.setMomentOfInertia(inertiaFoot);
    link.setMass(RobotParameters.MASSES.get(LinkNames.FOOT_LINK));
    link.setComOffset(comOffsetFoot);

    Graphics3DObject linkGraphics = new Graphics3DObject();
    linkGraphics.translate(footOffsetX, 0.0, 0.0);
    linkGraphics.addCube(footX, footY, -footZ, RobotParameters.APPEARANCE.get(LinkNames.FOOT_LINK));
    link.setLinkGraphics(linkGraphics);
    //      link.addEllipsoidFromMassProperties(YoAppearance.Green());
    link.addCoordinateSystemToCOM(0.3);
    idToSCSLegJointMap.get(allLegJoints.get(robotSide).get(jointName)).setLink(link);
  }
  private Link body() {

    Link ret = new Link("body");
    ret.setMass(bodyMass);

    // Inertia tensor
    double IxxCube = (bodyMass / 12.0) * (Math.pow(cubeW, 2.0) + Math.pow(cubeL, 2.0));
    double IyyCube = (bodyMass / 12.0) * (Math.pow(cubeH, 2.0) + Math.pow(cubeW, 2.0));
    double IzzCube = (bodyMass / 12.0) * (Math.pow(cubeH, 2.0) + Math.pow(cubeL, 2.0));
    ret.setMomentOfInertia(IxxCube, IyyCube, IzzCube);

    // Graphics
    Graphics3DObject linkGraphics = new Graphics3DObject();
    linkGraphics.addCube(cubeL, cubeW, cubeH, YoAppearance.Glass());

    ret.setLinkGraphics(linkGraphics);
    ret.setComOffset(0.0, 0.0, cubeH / 2.0); // Move the CoM to the center
    // of the body
    ret.addCoordinateSystemToCOM(0.4);

    return ret;
  }