2
$\begingroup$

I want to duplicate objects. I want them to have the same geometry, with many polygons, so I do not want to create copies, I'd like to create instances. Then I want them to have different scale animations

but when I'm duplicating objects with command:

bpy.ops.object.duplicate(linked=True)

and then creating an animation of scale of duplicated object the source object has the same animation, how can I change that?

$\endgroup$
1
$\begingroup$

Here is a test script, select an object(s) and run. It will add the selected objects to a group, remove any animation already on those objects. Then using the group create 20 group instances with random locations.

Using code similar to here to create a simple 2 keyframe random scale action

import bpy
from random import uniform

def random_scale_action():
    action = bpy.data.actions.new("RandomScaleAction")
    data_path = "scale"
    # (frame, value) for keyframe point
    for axis in [0, 1, 2]:
        # new fcurve
        fc = action.fcurves.new(data_path, index=axis)
        # add a new keyframe point
        fc.keyframe_points.add(count=2)
        for kfp in fc.keyframe_points:
            kfp.co = (uniform(1,100), uniform(0, 1))

    return action

context = bpy.context
scene = context.scene 

# create a group and add the selected objects to it.    
group = bpy.data.groups.new("CubeGroup")
for obj in context.selected_objects:
    # remove any animation data.
    if obj.animation_data:
        obj.animation_data.clear()
    group.objects.link(obj)
# create 20 randomly located dupli_groups.
for i in range(20):     
    instance = bpy.data.objects.new('dupli_group', None)
    instance.location = [uniform(0,10) for i in range(3)]
    instance.dupli_type = 'GROUP'
    instance.dupli_group = group
    scene.objects.link(instance)
    instance.animation_data_create()
    # give a random scale action
    instance.animation_data.action = random_scale_action()
| improve this answer | |
$\endgroup$
0
$\begingroup$

This has been tested in 2.8:

If the original (template) object is named 'Original':

original_mesh_data = bpy.data.objects['Original'].data
# Create new object with linked mesh data
new_object = bpy.data.objects.new('CopiedMesh', original_mesh_data)

# Create animation data for new object
new_object.animation_data_create()

# Copy (do not link) original object’s action into new object’s action
new_object.animation_data.action = template_object.animation_data.action.copy()

# Renamed action if desired
new_object.animation_data.action.name = ‘NewAction’
| improve this answer | |
$\endgroup$

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.