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)
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)
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