Search in sources :

Example 31 with MechModel

use of artisynth.core.mechmodels.MechModel in project artisynth_core by artisynth.

the class TransverseIsotropyTest method build.

@Override
public void build(String[] args) throws IOException {
    super.build(args);
    MechModel mech = new MechModel("mech");
    addModel(mech);
    double h = 0.1;
    double r = 0.005;
    FemModel3d fem = createCylinder(h, r);
    fem.setName("transverse");
    mech.addModel(fem);
    TransverseLinearMaterial mat = new TransverseLinearMaterial();
    mat.setYoungsModulus(50000, 50000);
    mat.setPoissonsRatio(0.45, 0.45);
    double G = 50000 / (2 * (1 + 0.45));
    mat.setShearModulus(G);
    mat.setCorotated(true);
    fem.setMaterial(mat);
    FemModel3d fem2 = createCylinder(h, r);
    fem2.setName("linear");
    LinearMaterial lmat = new LinearMaterial(50000, 0.45, true);
    fem2.setMaterial(lmat);
    mech.addModel(fem2);
    RigidTransform3d rot = new RigidTransform3d(Vector3d.ZERO, AxisAngle.ROT_Y_90);
    fem.transformGeometry(rot);
    fem2.transformGeometry(rot);
    fem2.transformGeometry(new RigidTransform3d(new Vector3d(0, 2 * r, 0), AxisAngle.IDENTITY));
    RenderProps.setFaceColor(fem2, Color.MAGENTA);
}
Also used : MechModel(artisynth.core.mechmodels.MechModel) RigidTransform3d(maspack.matrix.RigidTransform3d) FemModel3d(artisynth.core.femmodels.FemModel3d) Vector3d(maspack.matrix.Vector3d) TransverseLinearMaterial(artisynth.core.materials.TransverseLinearMaterial) TransverseLinearMaterial(artisynth.core.materials.TransverseLinearMaterial) LinearMaterial(artisynth.core.materials.LinearMaterial)

Example 32 with MechModel

use of artisynth.core.mechmodels.MechModel in project artisynth_core by artisynth.

the class TwoStrandWrapBase method build.

public void build(String[] args) {
    myMech = new MechModel("mechMod");
    myMech.setGravity(0, 0, -9.8);
    myMech.setFrameDamping(1.0);
    myMech.setRotaryDamping(0.1);
    myP0 = new Particle(0.1, size * 3, -myGap / 2, size / 2);
    myP0.setDynamic(false);
    myMech.addParticle(myP0);
    myP1 = new Particle(0.1, -size * 3, -myGap / 2, size / 2);
    myP1.setDynamic(false);
    myMech.addParticle(myP1);
    myP2 = new Particle(0.1, -size * 3, myGap / 2, size / 2);
    myP2.setDynamic(false);
    myMech.addParticle(myP2);
    myP3 = new Particle(0.1, size * 3, myGap / 2, size / 2);
    myP3.setDynamic(false);
    myMech.addParticle(myP3);
    mySpring = new MultiPointSpring("spring", 1, 0.1, 0);
    mySpring.addPoint(myP0);
    mySpring.setSegmentWrappable(50);
    mySpring.addPoint(myP1);
    mySpring.addPoint(myP2);
    mySpring.setSegmentWrappable(50);
    mySpring.addPoint(myP3);
    // mySpring.setWrapDamping (1.0);
    // mySpring.setWrapStiffness (10);
    // mySpring.setWrapH (0.01);
    myMech.addMultiPointSpring(mySpring);
    mySpring.setDrawKnots(false);
    mySpring.setDrawABPoints(true);
    mySpring.setWrapDamping(100);
    mySpring.setMaxWrapIterations(10);
    addModel(myMech);
    RenderProps.setPointStyle(myMech, Renderer.PointStyle.SPHERE);
    RenderProps.setPointRadius(myMech, size / 10);
    RenderProps.setLineStyle(myMech, Renderer.LineStyle.CYLINDER);
    RenderProps.setLineRadius(myMech, size / 30);
    RenderProps.setLineColor(myMech, Color.red);
    createControlPanel(myMech);
}
Also used : Particle(artisynth.core.mechmodels.Particle) MechModel(artisynth.core.mechmodels.MechModel) MultiPointSpring(artisynth.core.mechmodels.MultiPointSpring)

Example 33 with MechModel

use of artisynth.core.mechmodels.MechModel in project artisynth_core by artisynth.

the class CylinderWrapping method build.

public void build(String[] args) {
    MechModel mechMod = new MechModel("mechMod");
    addModel(mechMod);
    mechMod.setGravity(0, 0, -9.8);
    mechMod.setFrameDamping(100.0);
    mechMod.setRotaryDamping(10.0);
    double density = 150;
    double size = 1.0;
    Particle p1 = new Particle(0.1, -size, 0, 4 * size);
    p1.setDynamic(false);
    mechMod.addParticle(p1);
    Particle p2 = new Particle(0.1, -size, 0, 0);
    p2.setDynamic(false);
    mechMod.addParticle(p2);
    // create cylindrical wrapping object
    RigidCylinder cylinder = new RigidCylinder("cylinder", size / 2, 3.5 * size, density, 50);
    cylinder.setPose(new RigidTransform3d(0, 0, 1.5 * size, 0, 0, Math.PI / 2));
    cylinder.setDynamic(false);
    mechMod.addRigidBody(cylinder);
    // create ellipsoidal wrapping object
    double rad = 0.6 * size;
    RigidEllipsoid ball = new RigidEllipsoid("ball", rad, 2 * rad, rad, density, 50);
    ball.transformGeometry(new RigidTransform3d(size * 3, 0, 0));
    mechMod.addRigidBody(ball);
    // attach a marker to the ball
    FrameMarker p0 = new FrameMarker();
    double halfRoot2 = Math.sqrt(2) / 2;
    mechMod.addFrameMarker(p0, ball, new Point3d(-rad * halfRoot2, 0, rad * halfRoot2));
    // enable collisions between the ball and cylinder
    mechMod.setCollisionBehavior(cylinder, ball, true);
    // create the spring, making the segments between p0-p1 and p1-p2 each
    // wrappable with 50 knot points each
    MultiPointSpring spring = new MultiPointSpring("spring", 300, 1.0, 0);
    spring.addPoint(p0);
    spring.setSegmentWrappable(50, new Point3d[] { new Point3d(3, 0, 3) });
    spring.addWrappable(cylinder);
    spring.addWrappable(ball);
    spring.addPoint(p1);
    spring.setSegmentWrappable(50);
    spring.addPoint(p2);
    // optional: shrink wrapping segments around obstacles
    spring.updateWrapSegments();
    mechMod.addMultiPointSpring(spring);
    // set various rendering properties
    RenderProps.setSphericalPoints(p0, size / 10, Color.WHITE);
    RenderProps.setSphericalPoints(p1, size / 5, Color.BLUE);
    RenderProps.setSphericalPoints(p2, size / 10, Color.WHITE);
    RenderProps.setSphericalPoints(spring, size / 10, Color.GRAY);
    RenderProps.setCylindricalLines(spring, size / 30, Color.RED);
    createControlPanel(spring);
}
Also used : Particle(artisynth.core.mechmodels.Particle) MechModel(artisynth.core.mechmodels.MechModel) RigidTransform3d(maspack.matrix.RigidTransform3d) FrameMarker(artisynth.core.mechmodels.FrameMarker) RigidEllipsoid(artisynth.core.mechmodels.RigidEllipsoid) Point3d(maspack.matrix.Point3d) RigidCylinder(artisynth.core.mechmodels.RigidCylinder) MultiPointSpring(artisynth.core.mechmodels.MultiPointSpring)

Example 34 with MechModel

use of artisynth.core.mechmodels.MechModel in project artisynth_core by artisynth.

the class MechModelDemo method build.

public void build(String[] args) {
    myMech = new MechModel("mechMod");
    // mechMod.setProfiling (true);
    myMech.setGravity(0, 0, -50);
    // myMech.setRigidBodyDamper (new FrameDamper (1.0, 4.0));
    myMech.setFrameDamping(1.0);
    myMech.setRotaryDamping(4.0);
    myMech.setIntegrator(MechSystemSolver.Integrator.SymplecticEuler);
    RigidTransform3d XMB = new RigidTransform3d();
    RigidTransform3d XLW = new RigidTransform3d();
    RigidTransform3d TCA = new RigidTransform3d();
    RigidTransform3d TCB = new RigidTransform3d();
    RigidTransform3d XAB = new RigidTransform3d();
    PolygonalMesh mesh;
    // number of slices for approximating a circle
    int nslices = 16;
    // // set view so tha points upwards
    // X.R.setAxisAngle (1, 0, 0, -Math.PI/2);
    // viewer.setTransform (X);
    double lenx0 = 15;
    double leny0 = 15;
    double lenz0 = 1.5;
    RigidBody base = new RigidBody("base");
    base.setInertia(SpatialInertia.createBoxInertia(10, lenx0, leny0, lenz0));
    mesh = MeshFactory.createBox(lenx0, leny0, lenz0);
    // XMB.setIdentity();
    // XMB.R.setAxisAngle (1, 1, 1, 2*Math.PI/3);
    // mesh.transform (XMB);
    // mesh.setRenderMaterial (Material.createSpecial (Material.GRAY));
    base.setMesh(mesh, /* fileName= */
    null);
    XLW.setIdentity();
    XLW.p.set(0, 0, 22);
    base.setPose(XLW);
    base.setDynamic(false);
    myMech.addRigidBody(base);
    RenderProps props;
    FrameMarker mk0 = new FrameMarker();
    props = mk0.createRenderProps();
    // props.setColor (Color.GREEN);
    props.setPointRadius(0.5);
    props.setPointStyle(Renderer.PointStyle.SPHERE);
    mk0.setRenderProps(props);
    myMech.addFrameMarker(mk0, base, new Point3d(lenx0 / 2, leny0 / 2, 0));
    FrameMarker mk1 = new FrameMarker();
    mk1.setRenderProps(props);
    myMech.addFrameMarker(mk1, base, new Point3d(-lenx0 / 2, -leny0 / 2, 0));
    FrameMarker mk2 = new FrameMarker();
    mk2.setRenderProps(props);
    FrameMarker mk3 = new FrameMarker();
    mk3.setRenderProps(props);
    double ks = 10;
    double ds = 10;
    AxialSpring spr0 = new AxialSpring(50, 10, 0);
    AxialSpring spr1 = new AxialSpring(50, 10, 0);
    props = spr0.createRenderProps();
    props.setLineStyle(Renderer.LineStyle.CYLINDER);
    props.setLineRadius(0.2);
    props.setLineColor(Color.RED);
    spr0.setRenderProps(props);
    spr1.setRenderProps(props);
    // myMech.addRigidBody (base);
    // first link
    double lenx1 = 10;
    double leny1 = 2;
    double lenz1 = 3;
    RigidBody link1 = new RigidBody("link1");
    link1.setInertia(SpatialInertia.createBoxInertia(10, lenx1, leny1, lenz1));
    mesh = MeshFactory.createRoundedBox(lenx1, leny1, lenz1, nslices / 2);
    XMB.setIdentity();
    XMB.R.setAxisAngle(1, 1, 1, 2 * Math.PI / 3);
    mesh.transform(XMB);
    // mesh.setRenderMaterial (Material.createSpecial (Material.GRAY));
    link1.setMesh(mesh, /* fileName= */
    null);
    XLW.R.setAxisAngle(1, 0, 0, Math.PI / 2);
    // XLW.R.mulAxisAngle (0, 1, 0, Math.PI/4);
    XLW.p.set(0, 0, 1.5 * lenx1);
    link1.setPose(XLW);
    myMech.addRigidBody(link1);
    myMech.addFrameMarker(mk2, link1, new Point3d(-lenx1 / 2, 0, -lenz1 / 2));
    myMech.addFrameMarker(mk3, link1, new Point3d(-lenx1 / 2, 0, lenz1 / 2));
    // // joint 1
    // if (usePlanarJoint)
    // {
    // TCA.setIdentity();
    // TCA.p.set (-lenx1/2, 0, 0);
    // TCA.R.setAxisAngle (1, 0, 0, -Math.PI/2);
    // TCB.p.set (0, 0, lenx1);
    // // TCB.R.setAxisAngle (1, 0, 0, -Math.PI/2);
    // PlanarConnector planar =
    // new PlanarConnector (link1, TCA.p, TCB);
    // planar.setName ("plane1");
    // planar.setPlaneSize (20);
    // RenderProps.setColor (planar, Color.BLUE);
    // joint1 = planar;
    // }
    // else
    // {
    // TCA.setIdentity();
    // TCA.p.set (-lenx1/2, 0, 0);
    // // TCA.R.mulAxisAngle (0, 1, 0, Math.PI/4);
    // TCB.set (link1.myState.XFrameToWorld);
    // TCB.mul (TCA);
    // RevoluteJoint rjoint = new RevoluteJoint (link1, TCA, TCB);
    // rjoint.setName ("joint1");
    // rjoint.setAxisLength (4);
    // RenderProps.setLineRadius(rjoint, 0.2);
    // joint1 = rjoint;
    // // SphericalJoint sjoint = new SphericalJoint (
    // // link1, TCA, TCB);
    // // sjoint.setName ("joint1");
    // // sjoint.setAxisLength (5);
    // // joint1 = sjoint;
    // }
    // second link
    double lenx2 = 10;
    double leny2 = 2;
    double lenz2 = 2;
    RigidBody link2 = new RigidBody("link2");
    if (// useSphericalJoint)
    false) {
        mesh = MeshFactory.createRoundedCylinder(leny2 / 2, lenx2, nslices, /*nsegs=*/
        1, /*flatBottom=*/
        false);
        link2.setInertia(SpatialInertia.createBoxInertia(10, leny2, leny2, lenx2));
        XLW.R.setAxisAngle(1, 0, 0, Math.PI / 2);
        XLW.p.set(lenx1 / 2, lenx2 / 2, lenx1);
        link2.setPose(XLW);
    }
    mesh = MeshFactory.createRoundedCylinder(leny2 / 2, lenx2, nslices, /*nsegs=*/
    1, /*flatBottom=*/
    false);
    mesh.transform(XMB);
    link2.setInertia(SpatialInertia.createBoxInertia(10, lenx2, leny2, lenz2));
    XLW.R.setAxisAngle(1, 0, 0, Math.PI / 2);
    XLW.p.set(lenx1 / 2 + lenx2 / 2, 0, 1.5 * lenx1);
    if (useSphericalJoint) {
        // Math.PI/4;
        double ang = 0;
        XLW.R.mulAxisAngle(0, 1, 0, ang);
        XLW.p.y += Math.sin(ang) * lenx2 / 2;
        XLW.p.x -= (1 - Math.cos(ang)) * lenx2 / 2;
    }
    link2.setPose(XLW);
    link2.setMesh(mesh, /* fileName= */
    null);
    myMech.addRigidBody(link2);
    BodyConnector joint2 = null;
    // joint 2
    if (useSphericalJoint) {
        TCA.setIdentity();
        TCA.p.set(-lenx2 / 2, 0, 0);
        XAB.mulInverseLeft(link1.getPose(), link2.getPose());
        TCB.mul(XAB, TCA);
        SphericalJoint sjoint = new SphericalJoint(link2, TCA, link1, TCB);
        // RevoluteJoint joint2 = new RevoluteJoint (link2, TCA, TCB);
        sjoint.setName("joint2");
        // RenderProps.setLineRadius(sjoint, 0.2);
        sjoint.setAxisLength(4);
        joint2 = sjoint;
    } else {
        TCA.setIdentity();
        TCA.p.set(-lenx2 / 2, 0, 0);
        // TCA.R.mulAxisAngle (1, 0, 0, -Math.toRadians(90));
        XAB.mulInverseLeft(link1.getPose(), link2.getPose());
        TCB.mul(XAB, TCA);
        RevoluteJoint rjoint = new RevoluteJoint(link2, TCA, link1, TCB);
        // TCB.mul (link2.getPose(), TCA);
        // RevoluteJoint rjoint =
        // new RevoluteJoint (link2, TCA, TCB);
        // RigidTransform3d X = new RigidTransform3d();
        // X.R.setAxisAngle (1, 0, 0, -Math.toRadians(90));
        // X.mul (TCB, X);
        // X.mulInverseRight (X, TCB);
        // rjoint.transformGeometry (X);
        // rjoint.printData();
        rjoint.setName("joint2");
        rjoint.setAxisLength(4);
        RenderProps.setLineRadius(rjoint, 0.2);
        // RigidTransform3d X = new RigidTransform3d();
        // RigidTransform3d TDW = rjoint.getXDW();
        // System.out.println ("getXDW=\n" + TDW.toString("%8.3f"));
        // X.R.setAxisAngle (1, 0, 0, Math.toRadians(80));
        // X.mulInverseRight (X, TDW);
        // X.mul (TDW, X);
        // rjoint.transformGeometry (X, rjoint);
        joint2 = rjoint;
    }
    // myMech.addBodyConnector (joint1);
    if (joint2 != null) {
        myMech.addBodyConnector(joint2);
    }
    myMech.attachAxialSpring(mk0, mk2, spr0);
    myMech.attachAxialSpring(mk1, mk3, spr1);
    if (usePlanarContacts) {
        TCA.setIdentity();
        TCA.p.set(lenx2 / 2 + leny2 / 2, 0, 0);
        TCB.setIdentity();
        // TCB.p.set (0, 0, -lenx2/2);
        // TCB.p.set (0, 0, lenx2/2);
        TCB.R.setIdentity();
        TCB.R.setAxisAngle(0, 0, 1, Math.PI / 2);
        TCB.R.mulAxisAngle(1, 0, 0, Math.toRadians(20));
        PlanarConnector contact1 = new PlanarConnector(link2, TCA.p, TCB);
        contact1.setUnilateral(true);
        contact1.setName("contact1");
        contact1.setPlaneSize(20);
        RenderProps.setFaceColor(contact1, new Color(0.5f, 0.5f, 1f));
        RenderProps.setAlpha(contact1, 0.5);
        myMech.addBodyConnector(contact1);
        TCB.R.setIdentity();
        TCB.R.setAxisAngle(0, 0, 1, Math.PI / 2);
        TCB.R.mulAxisAngle(1, 0, 0, -Math.toRadians(20));
        PlanarConnector contact2 = new PlanarConnector(link2, TCA.p, TCB);
        contact2.setUnilateral(true);
        contact2.setName("contact2");
        contact2.setPlaneSize(20);
        RenderProps.setFaceColor(contact2, new Color(0.5f, 0.5f, 1f));
        RenderProps.setAlpha(contact2, 0.5);
        myMech.addBodyConnector(contact2);
    }
    myMech.setBounds(new Point3d(0, 0, -10), new Point3d(0, 0, 10));
    addModel(myMech);
    addControlPanel(myMech);
// RigidTransform3d X = new RigidTransform3d (link1.getPose());
// X.R.mulRpy (Math.toRadians(-10), 0, 0);
// link1.setPose (X);
// myMech.projectRigidBodyPositionConstraints();
// myMech.setProfiling (true);
// myMech.setIntegrator (Integrator.ForwardEuler);
// addBreakPoint (0.57);
}
Also used : SphericalJoint(artisynth.core.mechmodels.SphericalJoint) Color(java.awt.Color) RevoluteJoint(artisynth.core.mechmodels.RevoluteJoint) BodyConnector(artisynth.core.mechmodels.BodyConnector) RevoluteJoint(artisynth.core.mechmodels.RevoluteJoint) WayPoint(artisynth.core.probes.WayPoint) SphericalJoint(artisynth.core.mechmodels.SphericalJoint) AxialSpring(artisynth.core.mechmodels.AxialSpring) MechModel(artisynth.core.mechmodels.MechModel) FrameMarker(artisynth.core.mechmodels.FrameMarker) PlanarConnector(artisynth.core.mechmodels.PlanarConnector) RigidBody(artisynth.core.mechmodels.RigidBody)

Example 35 with MechModel

use of artisynth.core.mechmodels.MechModel in project artisynth_core by artisynth.

the class MultiMuscleDemo method build.

public void build(String[] args) {
    super.build(args);
    MechModel mechMod = (MechModel) models().get("mechMod");
    RigidBody block = mechMod.rigidBodies().get("block");
    Particle p0 = new Particle(0.1, 0, -size * 3, size / 2);
    p0.setDynamic(false);
    mechMod.addParticle(p0);
    Particle p1 = new Particle(0.1, 0, size * 3, size / 2);
    p1.setDynamic(false);
    mechMod.addParticle(p1);
    FrameMarker mkr0 = new FrameMarker();
    mechMod.addFrameMarker(mkr0, block, new Point3d(0, -size / 2, size / 2));
    FrameMarker mkr1 = new FrameMarker();
    mechMod.addFrameMarker(mkr1, block, new Point3d(0, size / 2, size / 2));
    MultiPointMuscle muscle = new MultiPointMuscle();
    LinearAxialMuscle mat = new LinearAxialMuscle();
    mat.setForceScaling(1);
    mat.setMaxForce(10);
    mat.setMaxLength(size);
    mat.setPassiveFraction(0.1);
    muscle.setMaterial(mat);
    muscle.addPoint(p0);
    muscle.addPoint(mkr0);
    muscle.addPoint(mkr1);
    muscle.addPoint(p1);
    mechMod.addMultiPointSpring(muscle);
    RenderProps.setLineColor(mechMod, Color.BLUE);
    RenderProps.setLineStyle(muscle, LineStyle.SPINDLE);
    RenderProps.setLineRadius(muscle, 0.1);
    RenderProps.setLineColor(muscle, Color.RED);
}
Also used : Particle(artisynth.core.mechmodels.Particle) LinearAxialMuscle(artisynth.core.materials.LinearAxialMuscle) MechModel(artisynth.core.mechmodels.MechModel) FrameMarker(artisynth.core.mechmodels.FrameMarker) Point3d(maspack.matrix.Point3d) RigidBody(artisynth.core.mechmodels.RigidBody) MultiPointMuscle(artisynth.core.mechmodels.MultiPointMuscle)

Aggregations

MechModel (artisynth.core.mechmodels.MechModel)59 RigidBody (artisynth.core.mechmodels.RigidBody)25 RigidTransform3d (maspack.matrix.RigidTransform3d)19 FemModel3d (artisynth.core.femmodels.FemModel3d)14 FemNode3d (artisynth.core.femmodels.FemNode3d)8 Particle (artisynth.core.mechmodels.Particle)8 PolygonalMesh (maspack.geometry.PolygonalMesh)8 Vector3d (maspack.matrix.Vector3d)8 RevoluteJoint (artisynth.core.mechmodels.RevoluteJoint)7 LinearMaterial (artisynth.core.materials.LinearMaterial)6 FrameMarker (artisynth.core.mechmodels.FrameMarker)6 CollisionManager (artisynth.core.mechmodels.CollisionManager)5 Color (java.awt.Color)5 AxialSpring (artisynth.core.mechmodels.AxialSpring)4 BodyConnector (artisynth.core.mechmodels.BodyConnector)4 WayPoint (artisynth.core.probes.WayPoint)4 Point3d (maspack.matrix.Point3d)4 MultiPointSpring (artisynth.core.mechmodels.MultiPointSpring)3 PlanarConnector (artisynth.core.mechmodels.PlanarConnector)3 FemElement3d (artisynth.core.femmodels.FemElement3d)2