I'm trying to fold cloth around a table to created a fitted look. I found someone who asked a question about pinning cloth to an object, which seems to do what I want, but there is a key difference; I need to do it with multiple objects.

The way I see it in my head, I would parent the cloth's corners to the object, and then move the objects into the location I need them in to fold the cloth how I want. Does anyone know how to do either this, or an easier way to fold cloth? Any help is appreciated!

Link to related question: Pin cloth to model

  • 2
    $\begingroup$ Did you try vertex groups? And give a screenshot of what you want to do. $\endgroup$ Jun 7 '19 at 7:58
  • 1
    $\begingroup$ The cloth object can have multiple hooks setup, each linked to a different object. Unless you are animating the cloth being folded, you don't need the sim to fold some clothing. Just model it as if it was folded. $\endgroup$
    – sambler
    Jun 8 '19 at 6:00
  • $\begingroup$ You can do it by modeling a cube to a narrow bar and give it a collision physics and put the cloth above it with a cloth simulation. Play the animation select the perfect frame apply the modifier .Move it where ever you want . $\endgroup$
    – Nxdhin2005
    Jul 20 '20 at 13:35

In the future, it would be best to add a .blend file or to be more specific about your objectives. In lieu of this, here is a quick script that does folding and then unfolding of cloth. Hopefully you can build upon this for your own needs. I am using Blender 2.82a. Quick summary of the script:

  • Removes starting cube and creates a supporting plane to go under the cloth.
  • Creates the cloth via a plane and subdividing, and adds cloth modifier.
  • Creates an armature, and assigns a vertex group to a designated index. (Unfortunately, finding desired vertex indices is sometimes challenging, and to start I refer you to this question. The code is also somewhat delicate in that re-arranging some of the lines of code will lead to undesired results even if it seems harmless.)
  • Assigns keyframes to the armature so that it will make a fold, and then an unfold because why not?

The script:

import bpy
from mathutils import Vector

def clear_scene():
    # Get rid of the starting cube..

def make_supporting_plane():
    # Make an underlying plane to support cloth, with high cloth_friction.
    bpy.ops.mesh.primitive_plane_add(size=6, location=(0, 0, 0))
    #bpy.ops.transform.resize(value=(6.0, 6.0, 6.0))
    bpy.context.object.collision.cloth_friction = 50

def make_cloth_and_arm():
    # Add the cloth. Tune the number of cuts for cloth detail.
    bpy.ops.mesh.primitive_plane_add(size=3, location=(0, 0, 0.1))

    # Turn on collisions an increase the quality of the steps.
    cloth = bpy.data.objects["Plane.001"]
    cloth.modifiers["Cloth"].settings.quality = 10
    cloth.modifiers["Cloth"].collision_settings.collision_quality = 5
    cloth.modifiers["Cloth"].collision_settings.use_self_collision = True

    # Add armature, and make it the parent of the cloth. Creating the
    # armature 'deselects' cloth, so re-select cloth (in addition to armature).
    bpy.ops.object.armature_add(enter_editmode=False, location=(0, 0, 0))
    arm = bpy.context.object

    # The arm must be the active object if it is the parent (else it's the child).
    bpy.context.view_layer.objects.active = arm

    # Hard-code a vertex index to see which ones to pin. Look in edit mode.
    bpy.context.view_layer.objects.active = cloth
    vertices_to_pin = [1]
    cloth_vgroup = cloth.vertex_groups.new(name='Pinned')
    cloth_vgroup.add(vertices_to_pin, 1.0, 'ADD')
    cloth.modifiers["Cloth"].settings.vertex_group_mass = cloth_vgroup.name

    # The modifier must be at the TOP of the modifier stack (over cloth)!
    for _ in range(3):

    # Need this to make armature move the vertices. But I'm not sure why it works. :)
    arm_group = bpy.context.object.vertex_groups["Bone"]
    arm_group.add(vertices_to_pin, 1.0, 'ADD')
    return (cloth, arm)

def animate(cloth, arm):
    # Select items, enter Pose mode.
    bpy.context.view_layer.objects.active = arm

    # Adjust keyframes of armature, which will move it along with cloth vertices.
    frames = [0, 30, 90, 120, 130, 160, 220, 250]
    bone = arm.pose.bones['Bone']
    bone.keyframe_insert("location", frame=frames[0])
    bone.location += Vector((0, 1, 0))
    bone.keyframe_insert("location", frame=frames[1])
    bone.location += Vector((-2, 0, -2))
    bone.keyframe_insert("location", frame=frames[2])
    bone.location += Vector((0, -1, 0))
    bone.keyframe_insert("location", frame=frames[3])
    bone.keyframe_insert("location", frame=frames[4]) # pause 10 frames
    bone.location += Vector((0, 1, 0))
    bone.keyframe_insert("location", frame=frames[5])
    bone.location += Vector((2, 0, 2))
    bone.keyframe_insert("location", frame=frames[6])
    bone.location += Vector((0, -1, 0))
    bone.keyframe_insert("location", frame=frames[7])

    # Back to Object mode.

if __name__ == '__main__':
    cloth, arm = make_cloth_and_arm()
    animate(cloth, arm)

If the script is in test.py, then run blender -P test.py from the command line. Upon opening Blender, I click the cloth and bake the simulation. Then, I click "play," I see this in my screen recording:

enter image description here

Hope this helps!


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.