Esempio n. 1
0
def createArticulatedCone(axis=1,
                          basePos=-1,
                          tipPos=1,
                          radius=1,
                          colour=(0.6, 0.6, 0.6),
                          moiScale=1,
                          withMesh=True,
                          **kwargs):
    """
    Create an articulated rigid body for a cone with the specified attributes (axis is 0:x, 1:y, 2:z). Other articulated rigid body parameters can be specified with keyword arguments, look at
    App.Proxys.ArticulatedRigidBody for more details on available arguments. The following arguments will not be used:
        meshes, moi, cdps.
    If a negative mass parameter is specified, it will be scaled by the box volume and made positive.
    """

    _fixMass(kwargs, math.pi * radius * radius * math.fabs(tipPos - basePos))

    from App import Proxys
    proxy = Proxys.ArticulatedRigidBody(**kwargs)

    return _createCone(proxy, axis, basePos, tipPos, radius, colour, moiScale,
                       withMesh)
Esempio n. 2
0
def createArticulatedTaperedBox(size=(1, 1, 1),
                                colour=(0.6, 0.6, 0.6),
                                exponentBottom=5,
                                exponentTop=5,
                                exponentSide=5,
                                moiScale=1,
                                withMesh=True,
                                **kwargs):
    """
    Create an articulated rigid body for a box of the specified size with tapered ends. Other articulated rigid body parameters can be specified with keyword arguments, look at
    App.Proxys.ArticulatedRigidBody for more details on available arguments. The following arguments will not be used:
        meshes, moi, cdps.
    If mass is negative, it will be scaled by the box volume and made positive.
    """

    _fixMass(kwargs, size[0] * size[1] * size[2])

    from App import Proxys
    proxy = Proxys.ArticulatedRigidBody(**kwargs)

    return _createTaperedBox(proxy, size, colour, exponentBottom, exponentTop,
                             exponentSide, moiScale, withMesh)
Esempio n. 3
0
    def createCharacter(self):
        """Creates a 3D character that follows this description."""
        from App import Proxys

        blue = (0.5, 0.6, 0.8, 1)
        green = (0.5, 0.8, 0.6, 1)
        red = (0.892, 0.716, 0.602, 1)
        gray = (0.5, 0.5, 0.5, 1)

        character = Core.Character()

        character.setName("Instant Character")

        massScale = 900

        pelvisSizeY = self.getWaistPosY() - self.getHipPosY()
        pelvisBottomPos = -pelvisSizeY / 2.0 - self.getLegSizeY() * 0.1
        pelvisTopPos = pelvisSizeY / 2.0
        pelvisRadius = self.getPelvisDiameter() / 2.0
        rootPosY = self.getHipPosY() + pelvisSizeY / 2.0 + 0.007
        pelvis = PyUtils.RigidBody.createArticulatedTaperedBox(
            name="pelvis",
            size=(pelvisRadius * 2.0, pelvisSizeY * 1.5, pelvisRadius * 1.2),
            moiScale=3,
            exponentBottom=2,
            exponentSide=2,
            mass=-massScale,
            pos=(0, rootPosY, 0),
            colour=blue)
        character.setRoot(pelvis)

        totalLowerBackSizeY = self.getChestPosY() - self.getWaistPosY()
        lowerBackOffsetY = 0  #0.15 * totalLowerBackSizeY
        lowerBackSizeX = self.getTorsoDiameter() * 0.7
        lowerBackSizeY = totalLowerBackSizeY - lowerBackOffsetY
        lowerBackSizeZ = lowerBackSizeX * 0.7
        lowerback = PyUtils.RigidBody.createArticulatedTaperedBox(
            name="lowerBack",
            size=(lowerBackSizeX, lowerBackSizeY, lowerBackSizeZ),
            exponentTop=3,
            exponentBottom=2,
            exponentSide=2,
            mass=-massScale,
            colour=green)
        character.addArticulatedRigidBody(lowerback)

        joint = Proxys.BallInSocketJoint(
            name="pelvis_lowerback",
            posInParent=(0, pelvisSizeY / 2.0, 0),
            posInChild=(0, -lowerBackSizeY / 2.0 - lowerBackOffsetY, 0),
            swingAxis1=(1, 0, 0),
            twistAxis=(0, 0, 1),
            limits=(-1.6, 1.6, -1.6, 1.6, -1.6, 1.6)).createAndFillObject()
        joint.setParent(pelvis)
        joint.setChild(lowerback)
        character.addJoint(joint)

        totalTorsoSizeY = self.getShoulderPosY() - self.getChestPosY()
        torsoOffsetY = -0.2 * totalTorsoSizeY
        torsoSizeX = self.getTorsoDiameter()
        torsoSizeY = totalTorsoSizeY - torsoOffsetY
        torsoSizeZ = torsoSizeX * 0.6
        torso = PyUtils.RigidBody.createArticulatedTaperedBox(
            name="torso",
            size=(torsoSizeX, torsoSizeY, torsoSizeZ),
            exponentTop=2.2,
            exponentBottom=4,
            exponentSide=3,
            mass=-massScale,
            colour=green)
        character.addArticulatedRigidBody(torso)

        joint = Proxys.BallInSocketJoint(
            name="lowerback_torso",
            posInParent=(0, lowerBackSizeY / 2.0, 0),
            posInChild=(0, -torsoSizeY / 2.0 - torsoOffsetY, 0),
            swingAxis1=(1, 0, 0),
            twistAxis=(0, 0, 1),
            limits=(-1.6, 1.6, -1.6, 1.6, -1.6, 1.6)).createAndFillObject()
        joint.setParent(lowerback)
        joint.setChild(torso)
        character.addJoint(joint)

        headOffsetY = self.getNeckSizeY()
        headSizeX = self.getHeadSizeX()
        headSizeY = self.getHeadSizeY()
        headSizeZ = self.getHeadSizeZ()
        head = PyUtils.RigidBody.createArticulatedEllipsoid(
            name="head",
            radius=(headSizeX / 2.0, headSizeY / 2.0, headSizeZ / 2.0),
            mass=-massScale,
            withMesh=False)
        character.addArticulatedRigidBody(head)
        head.addMeshObj(
            "data/StockMeshes/head.obj", Vector3d(0, -0.064, 0),
            Vector3d(headSizeX * 6.5, headSizeY * 4.6, headSizeZ * 5.5))
        head.setColour(*red)
        head.addMesh(
            PyUtils.Mesh.createCylinder(
                basePoint=(0,
                           -headSizeY / 2.0 - headOffsetY - torsoSizeY * 0.1,
                           0),
                tipPoint=(0, -headSizeY * 0.2, 0),
                radius=0.12 * headSizeX,
                colour=red))

        joint = Proxys.BallInSocketJoint(
            name="torso_head",
            posInParent=(0, torsoSizeY / 2.0, 0),
            posInChild=(0, -headSizeY / 2.0 - headOffsetY, 0),
            swingAxis1=(1, 0, 0),
            twistAxis=(0, 0, 1),
            limits=(-1.6, 1.6, -1.6, 1.6, -1.6, 1.6)).createAndFillObject()
        joint.setParent(torso)
        joint.setChild(head)
        character.addJoint(joint)

        leftUpperArmSizeY = self.getShoulderPosY() - self.getElbowPosY(1)
        leftUpperArmDiameter = self.getUpperArmDiameter(1)
        lUpperArm = PyUtils.RigidBody.createArticulatedCylinder(
            name="lUpperArm",
            moiScale=3,
            axis=0,
            basePos=-leftUpperArmSizeY / 2.0,
            tipPos=leftUpperArmSizeY / 2.0,
            radius=leftUpperArmDiameter / 2.0,
            mass=-massScale,
            colour=green)
        character.addArticulatedRigidBody(lUpperArm)
        lUpperArm.addMesh(
            PyUtils.Mesh.createSphere((-leftUpperArmSizeY / 2.0, 0, 0),
                                      leftUpperArmDiameter * 0.65,
                                      colour=green))
        lUpperArm.addMesh(
            PyUtils.Mesh.createSphere((leftUpperArmSizeY / 2.0, 0, 0),
                                      leftUpperArmDiameter * 0.5,
                                      colour=green))

        joint = Proxys.BallInSocketJoint(
            name="lShoulder",
            posInParent=(torsoSizeX * 0.52, torsoSizeY * 0.32, 0),
            posInChild=(-leftUpperArmSizeY / 2.0, 0, 0),
            swingAxis1=(0, 0, 1),
            twistAxis=(1, 0, 0),
            limits=(-100, 100, -1.5, 1.5, -100, 100)).createAndFillObject()
        joint.setParent(torso)
        joint.setChild(lUpperArm)
        character.addJoint(joint)

        rightUpperArmSizeY = self.getShoulderPosY() - self.getElbowPosY(-1)
        rightUpperArmDiameter = self.getUpperArmDiameter(-1)
        rUpperArm = PyUtils.RigidBody.createArticulatedCylinder(
            name="rUpperArm",
            moiScale=3,
            axis=0,
            basePos=-rightUpperArmSizeY / 2.0,
            tipPos=rightUpperArmSizeY / 2.0,
            radius=rightUpperArmDiameter / 2.0,
            mass=-massScale,
            colour=green)
        character.addArticulatedRigidBody(rUpperArm)
        rUpperArm.addMesh(
            PyUtils.Mesh.createSphere((rightUpperArmSizeY / 2.0, 0, 0),
                                      rightUpperArmDiameter * 0.65,
                                      colour=green))
        rUpperArm.addMesh(
            PyUtils.Mesh.createSphere((-rightUpperArmSizeY / 2.0, 0, 0),
                                      rightUpperArmDiameter * 0.5,
                                      colour=green))

        joint = Proxys.BallInSocketJoint(
            name="rShoulder",
            posInParent=(-torsoSizeX * 0.52, torsoSizeY * 0.32, 0),
            posInChild=(rightUpperArmSizeY / 2.0, 0, 0),
            swingAxis1=(0, 0, 1),
            twistAxis=(1, 0, 0),
            limits=(-100, 100, -1.5, 1.5, -100, 100)).createAndFillObject()
        joint.setParent(torso)
        joint.setChild(rUpperArm)
        character.addJoint(joint)

        leftLowerArmSizeY = self.getElbowPosY(1) - self.getWristPosY(1)
        leftLowerArmDiameter = self.getLowerArmDiameter(1)
        lLowerArm = PyUtils.RigidBody.createArticulatedCylinder(
            name="lLowerArm",
            moiScale=3,
            axis=0,
            basePos=-leftLowerArmSizeY / 2.0,
            tipPos=leftLowerArmSizeY / 2.0,
            radius=leftLowerArmDiameter / 2.0,
            mass=-massScale,
            colour=red)
        character.addArticulatedRigidBody(lLowerArm)
        lLowerArm.addMesh(
            PyUtils.Mesh.createTaperedBox(
                position=(leftLowerArmSizeY * 0.5 + leftLowerArmDiameter * 0.8,
                          0, 0),
                size=(leftLowerArmDiameter * 1.6, leftLowerArmDiameter * 0.5,
                      leftLowerArmDiameter * 1.15),
                colour=red))

        joint = Proxys.HingeJoint(name="lElbow",
                                  posInParent=(leftUpperArmSizeY / 2.0, 0, 0),
                                  posInChild=(-leftLowerArmSizeY / 2.0, 0, 0),
                                  axis=(0, 1, 0),
                                  limits=(-2.7, 0)).createAndFillObject()
        joint.setParent(lUpperArm)
        joint.setChild(lLowerArm)
        character.addJoint(joint)

        rightLowerArmSizeY = self.getElbowPosY(-1) - self.getWristPosY(-1)
        rightLowerArmDiameter = self.getLowerArmDiameter(-1)
        rLowerArm = PyUtils.RigidBody.createArticulatedCylinder(
            name="rLowerArm",
            moiScale=3,
            axis=0,
            basePos=-rightLowerArmSizeY / 2.0,
            tipPos=rightLowerArmSizeY / 2.0,
            radius=rightLowerArmDiameter / 2.0,
            mass=-massScale,
            colour=red)
        character.addArticulatedRigidBody(rLowerArm)
        rLowerArm.addMesh(
            PyUtils.Mesh.createTaperedBox(
                position=(-rightLowerArmSizeY * 0.5 -
                          rightLowerArmDiameter * 0.8, 0, 0),
                size=(rightLowerArmDiameter * 1.6, rightLowerArmDiameter * 0.5,
                      rightLowerArmDiameter * 1.15),
                colour=red))

        joint = Proxys.HingeJoint(name="rElbow",
                                  posInParent=(-rightUpperArmSizeY / 2.0, 0,
                                               0),
                                  posInChild=(rightLowerArmSizeY / 2.0, 0, 0),
                                  axis=(0, -1, 0),
                                  limits=(-2.7, 0)).createAndFillObject()
        joint.setParent(rUpperArm)
        joint.setChild(rLowerArm)
        character.addJoint(joint)

        leftUpperLegSizeY = self.getHipPosY() - self.getKneePosY(1)
        leftUpperLegDiameter = self.getUpperLegDiameter(1)
        lUpperLeg = PyUtils.RigidBody.createArticulatedCylinder(
            name="lUpperLeg",
            axis=1,
            basePos=-leftUpperLegSizeY / 2.0,
            tipPos=leftUpperLegSizeY / 2.0,
            radius=leftUpperLegDiameter / 2.0,
            moiScale=4,
            mass=-massScale,
            colour=blue)
        character.addArticulatedRigidBody(lUpperLeg)
        lUpperLeg.addMesh(
            PyUtils.Mesh.createSphere((0, leftUpperLegSizeY / 2.0, 0),
                                      leftUpperLegDiameter * 0.5,
                                      colour=blue))
        lUpperLeg.addMesh(
            PyUtils.Mesh.createSphere((0, -leftUpperLegSizeY / 2.0, 0),
                                      leftUpperLegDiameter * 0.5,
                                      colour=blue))

        joint = Proxys.BallInSocketJoint(
            name="lHip",
            posInParent=(pelvisRadius * self.getLegRelativeAnchorX(1),
                         -pelvisSizeY / 2.0, 0),
            posInChild=(0, leftUpperLegSizeY / 2.0, 0),
            swingAxis1=(1, 0, 0),
            twistAxis=(0, 0, 1),
            limits=(-1.3, 1.9, -1, 1, -1, 1)).createAndFillObject()
        joint.setParent(pelvis)
        joint.setChild(lUpperLeg)
        character.addJoint(joint)

        rightUpperLegSizeY = self.getHipPosY() - self.getKneePosY(-1)
        rightUpperLegDiameter = self.getUpperLegDiameter(-1)
        rUpperLeg = PyUtils.RigidBody.createArticulatedCylinder(
            name="rUpperLeg",
            axis=1,
            basePos=-rightUpperLegSizeY / 2.0,
            tipPos=rightUpperLegSizeY / 2.0,
            radius=rightUpperLegDiameter / 2.0,
            moiScale=4,
            mass=-massScale,
            colour=blue)
        character.addArticulatedRigidBody(rUpperLeg)
        rUpperLeg.addMesh(
            PyUtils.Mesh.createSphere((0, -rightUpperLegSizeY / 2.0, 0),
                                      rightUpperLegDiameter * 0.5,
                                      colour=blue))
        rUpperLeg.addMesh(
            PyUtils.Mesh.createSphere((0, rightUpperLegSizeY / 2.0, 0),
                                      rightUpperLegDiameter * 0.5,
                                      colour=blue))

        joint = Proxys.BallInSocketJoint(
            name="rHip",
            posInParent=(-pelvisRadius * self.getLegRelativeAnchorX(-1),
                         -pelvisSizeY / 2.0, 0),
            posInChild=(0, rightUpperLegSizeY / 2.0, 0),
            swingAxis1=(1, 0, 0),
            twistAxis=(0, 0, 1),
            limits=(-1.3, 1.9, -1, 1, -1, 1)).createAndFillObject()
        joint.setParent(pelvis)
        joint.setChild(rUpperLeg)
        character.addJoint(joint)

        leftLowerLegSizeY = self.getKneePosY(1) - self.getAnklePosY(1)
        leftLowerLegDiameter = self.getLowerLegDiameter(1)
        lLowerLeg = PyUtils.RigidBody.createArticulatedCylinder(
            name="lLowerLeg",
            axis=1,
            basePos=-leftLowerLegSizeY / 2.0,
            tipPos=leftLowerLegSizeY / 2.0,
            radius=leftLowerLegDiameter / 2.0,
            moiScale=4,
            mass=-massScale,
            colour=blue)
        character.addArticulatedRigidBody(lLowerLeg)

        joint = Proxys.HingeJoint(name="lKnee",
                                  posInParent=(0, -leftUpperLegSizeY / 2.0, 0),
                                  posInChild=(0, leftLowerLegSizeY / 2.0, 0),
                                  axis=(1, 0, 0),
                                  limits=(0, 2.5)).createAndFillObject()
        joint.setParent(lUpperLeg)
        joint.setChild(lLowerLeg)
        character.addJoint(joint)

        rightLowerLegSizeY = self.getKneePosY(-1) - self.getAnklePosY(-1)
        rightLowerLegDiameter = self.getLowerLegDiameter(-1)
        rLowerLeg = PyUtils.RigidBody.createArticulatedCylinder(
            name="rLowerLeg",
            axis=1,
            basePos=-rightLowerLegSizeY / 2.0,
            tipPos=rightLowerLegSizeY / 2.0,
            radius=rightLowerLegDiameter / 2.0,
            moiScale=4,
            mass=-massScale,
            colour=blue)
        character.addArticulatedRigidBody(rLowerLeg)

        joint = Proxys.HingeJoint(name="rKnee",
                                  posInParent=(0, -rightUpperLegSizeY / 2.0,
                                               0),
                                  posInChild=(0, rightLowerLegSizeY / 2.0, 0),
                                  axis=(1, 0, 0),
                                  limits=(0, 2.5)).createAndFillObject()
        joint.setParent(rUpperLeg)
        joint.setChild(rLowerLeg)
        character.addJoint(joint)

        leftFootSizeX = self.getFootSizeX(1)
        leftFootSizeY = self.getAnklePosY(1) - self.getGroundPosY()
        leftFootSizeZ = self.getFootSizeZ(1) * 0.75
        lFoot = PyUtils.RigidBody.createArticulatedTaperedBox(
            name="lFoot",
            size=(leftFootSizeX, leftFootSizeY, leftFootSizeZ),
            exponentSide=20,
            groundCoeffs=(0.0005, 0.2),
            moiScale=3,
            mass=-massScale,
            colour=gray)
        character.addArticulatedRigidBody(lFoot)

        joint = Proxys.UniversalJoint(
            name="lAnkle",
            posInParent=(0, -leftLowerLegSizeY / 2.0, 0),
            posInChild=(0, leftFootSizeY / 2.0,
                        -leftFootSizeZ * 0.33 + leftLowerLegDiameter / 2.0),
            parentAxis=(0, 0, 1),
            childAxis=(1, 0, 0),
            limits=(-0.75, 0.75, -0.75, 0.75)).createAndFillObject()
        joint.setParent(lLowerLeg)
        joint.setChild(lFoot)
        character.addJoint(joint)

        rightFootSizeX = self.getFootSizeX(-1)
        rightFootSizeY = self.getAnklePosY(-1) - self.getGroundPosY()
        rightFootSizeZ = self.getFootSizeZ(-1) * 0.75
        rFoot = PyUtils.RigidBody.createArticulatedTaperedBox(
            name="rFoot",
            size=(rightFootSizeX, rightFootSizeY, rightFootSizeZ),
            exponentSide=20,
            groundCoeffs=(0.0005, 0.2),
            moiScale=3,
            mass=-massScale,
            colour=gray)
        character.addArticulatedRigidBody(rFoot)

        joint = Proxys.UniversalJoint(
            name="rAnkle",
            posInParent=(0, -rightLowerLegSizeY / 2.0, 0),
            posInChild=(0, rightFootSizeY / 2.0,
                        -rightFootSizeZ * 0.33 + rightLowerLegDiameter / 2.0),
            parentAxis=(0, 0, -1),
            childAxis=(1, 0, 0),
            limits=(-0.75, 0.75, -0.75, 0.75)).createAndFillObject()
        joint.setParent(rLowerLeg)
        joint.setChild(rFoot)
        character.addJoint(joint)

        leftToesSizeX = leftFootSizeX
        leftToesSizeY = leftFootSizeY * 0.66
        leftToesSizeZ = self.getFootSizeZ(1) - leftFootSizeZ
        lToes = PyUtils.RigidBody.createArticulatedTaperedBox(
            name="lToes",
            size=(leftToesSizeX, leftToesSizeY, leftToesSizeZ),
            exponentSide=20,
            groundCoeffs=(0.0005, 0.2),
            moiScale=3,
            mass=-massScale,
            colour=gray)
        character.addArticulatedRigidBody(lToes)

        joint = Proxys.HingeJoint(
            name="lToeJoint",
            posInParent=(0, (leftToesSizeY - leftFootSizeY) / 2.0 + 0.003,
                         leftFootSizeZ / 2.0),
            posInChild=(0, 0, -leftToesSizeZ / 2.0),
            axis=(1, 0, 0),
            limits=(-0.52, 0.1)).createAndFillObject()
        joint.setParent(lFoot)
        joint.setChild(lToes)
        character.addJoint(joint)

        rightToesSizeX = rightFootSizeX
        rightToesSizeY = rightFootSizeY * 0.66
        rightToesSizeZ = self.getFootSizeZ(-1) - rightFootSizeZ
        rToes = PyUtils.RigidBody.createArticulatedTaperedBox(
            name="rToes",
            size=(rightToesSizeX, rightToesSizeY, rightToesSizeZ),
            exponentSide=20,
            groundCoeffs=(0.0005, 0.2),
            moiScale=3,
            mass=-massScale,
            colour=gray)
        character.addArticulatedRigidBody(rToes)

        joint = Proxys.HingeJoint(
            name="rToeJoint",
            posInParent=(0, (rightToesSizeY - rightFootSizeY) / 2.0 + 0.003,
                         rightFootSizeZ / 2.0),
            posInChild=(0, 0, -rightToesSizeZ / 2.0),
            axis=(1, 0, 0),
            limits=(-0.52, 0.1)).createAndFillObject()
        joint.setParent(rFoot)
        joint.setChild(rToes)
        character.addJoint(joint)

        return character