2
$\begingroup$

I am trying to compress some spheres between two planes and see how physics works in blender and at what point the planes can't move further. I want to do this using python with blender physics. I have rendered the required objects using python. Could someone throw some light on this and let me know from where can I learn doing this kind of stuff. I have tried reading the API but, I did not find any resource which does physics using python.

I figured this out to some extent but the planes are passing through the objects. Is there a way to stop this from happening? I tried to set the planes to rigid body but then, they don't move at all because they are rigid bodies.Here's my script below:

import bpy
import bmesh
import math as m

def del_existing():
   del_obj = [item.name for item in bpy.data.objects if item.type == "MESH" or "LAMP"]
for obj in del_obj:
    bpy.data.objects[obj].select = True
bpy.ops.object.delete()

for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)

def makeMaterial(name, diffuse, specular, alpha):
   mat = bpy.data.materials.new(name)
   mat.diffuse_color = diffuse
   mat.diffuse_shader = 'LAMBERT' 
   mat.diffuse_intensity = 1.0 
   mat.specular_color = specular
   mat.specular_shader = 'PHONG'
   mat.specular_intensity = 0.5
   mat.alpha = alpha
   mat.ambient = 1
   return mat

def setMaterial(ob, mat):
   me = ob.data
   me.materials.append(mat)

def add_lamp(lname,srctype,location):
   scene = bpy.context.scene
   newl = bpy.data.lamps.new(name=lname,type=srctype)
   objl = bpy.data.objects.new(name=lname, object_data = newl)
   scene.objects.link(objl)
   objl.location=location
   print(list(bpy.data.objects))
   bpy.data.objects[lname].select = True
   bpy.data.objects["hemi"].data.energy = 0.9
   #scene.objects.active = objl
   #objl.select = True
   #scene.objects.active = objl
   #objl.use_trasparency = True

def add_camera():
   cam = bpy.ops.object.camera_add(view_align=True, location=(0.0,34,11.0),rotation=(m.radians(80), 0.0, m.radians(180)))
   #cam.location = (6.0,6.0,7.0)

def my_handler(scene):
   bpy.data.objects["Plane.003"].select = True
   bpy.data.objects["Plane.003"].location.x += -0.2
   bpy.data.objects["Plane.002"].location.x += 0.2
   print(bpy.data.objects.get("Cube").location)
   print(scene.objects["Plane.003"].location)


if __name__ == "__main__":
   del_existing()
   bpy.ops.mesh.primitive_plane_add(location = (0,0,0))
   bpy.data.objects["Plane"].select = True
   bpy.ops.rigidbody.object_add()
   selobj = bpy.context.active_object
   selobj.scale = (8,8,0)
   plane_mat = makeMaterial('planemat', (0.8,0.8,0.8), (0.5,0.5,0), 1)
   plane_mat2 = makeMaterial('planemat2', (0.6,0.0,0.0), (0.5,0.5,0), 1)
   plane_mat3 = makeMaterial('planemat3', (0.0,0.5,0.0), (0.5,0.5,0), 1)
   plane_mat4 = makeMaterial('planemat4', (0.0,0.0,0.5), (0.5,0.5,0), 1)
   setMaterial(bpy.context.object, plane_mat)
   bpy.ops.mesh.primitive_plane_add(location = (-8,-8,0))
   bpy.data.objects["Plane.001"].select = True
   bpy.ops.transform.rotate(value=m.radians(90),axis=(1,0,0))
   bpy.ops.transform.resize(value=(8,8,5))
   bpy.ops.transform.translate(value=(8,0,5))
   setMaterial(bpy.context.object, plane_mat2)
   bpy.ops.mesh.primitive_plane_add(location = (-8,-8,0))
   bpy.data.objects["Plane.002"].select = True
   bpy.ops.transform.rotate(value=m.radians(90),axis=(0,1,0))
   bpy.ops.transform.resize(value=(8,8,5))
   bpy.ops.transform.translate(value=(0,8,5))
   setMaterial(bpy.context.object, plane_mat3)
   bpy.ops.mesh.primitive_plane_add(location = (8,-8,0))
   bpy.data.objects["Plane.003"].select = True
   bpy.ops.transform.rotate(value=m.radians(90),axis=(0,1,0))
   bpy.ops.transform.resize(value=(8,8,5))
   bpy.ops.transform.translate(value=(0,8,5))
   setMaterial(bpy.context.object, plane_mat4)
   #selobj.rotate = (1,0,0)
   bpy.ops.mesh.primitive_plane_add(location = (0,0,10))
   selobj = bpy.context.active_object
   selobj.scale = (8,8,0)
   bpy.ops.mesh.primitive_cube_add(location = (2.5,0,1))
   bpy.data.objects["Cube"].select = True
   print('Cube',bpy.ops.rigidbody.object_add())
   selobj = bpy.context.active_object
   selobj.scale = (1,1,1)
   #print(bpy.context.object)
   #selobj.translate = (0,0,0)
   blue = makeMaterial('transcube', (0.16,0.05,0.8), (0.5,0.5,0), 2)
   setMaterial(bpy.context.object, blue)
   bpy.data.materials["transcube"].use_transparency = True
   bpy.data.materials["transcube"].transparency_method = 'RAYTRACE'
   bpy.data.materials["transcube"].raytrace_transparency.ior = 1.5
   bpy.data.materials["transcube"].alpha = 0.2
   #bpy.data.objects['Cube'].active_material = bpy.data.materials["transcube"]
   #print(bpy.data.materials["transcube"].use_transparency)
   bpy.ops.mesh.primitive_ico_sphere_add(location = (-4.3,3,1))
   bpy.data.objects["Icosphere"].select = True
   bpy.ops.rigidbody.object_add()
   bpy.ops.transform.resize(value=(1,1,1))
   bpy.data.objects['Icosphere'].active_material  = bpy.data.materials["transcube"]
   bpy.ops.object.modifier_add(type='SUBSURF')
   bpy.context.object.modifiers["Subsurf"].levels = 4
   bpy.ops.object.modifier_apply(apply_as='DATA',modifier='Subsurf')
   for obj in bpy.data.objects:
       for each in obj.data.polygons:
           each.use_smooth = 1
   #obj = bpy.context.active_object
   add_lamp("hemi","HEMI", (0,0,9.9))
   add_camera()
   bpy.context.scene.use_gravity = False
   bpy.context.scene.frame_end = 150

   # every frame change, this function is called.
   while len(bpy.app.handlers.frame_change_pre) > 0:
       bpy.app.handlers.frame_change_pre.pop()
   bpy.app.handlers.frame_change_pre.append(my_handler)
$\endgroup$

1 Answer 1

1
$\begingroup$

To alter the amount that an object can be squashed try turning on soft body and experiment with the soft body edge settings.

bpy.ops.object.modifier_add(type='SOFT_BODY')
bpy.context.object.modifiers["Softbody"].settings.use_stiff_quads = True
bpy.context.object.modifiers["Softbody"].settings.shear = 0.7

To prevent simulations passing through objects, first enable collision then adjust the collision properties. You may also need try adding more geometry (subdivide the mesh rather than just one face) and/or adding some thickness to the plane - like a flat cube.

bpy.ops.object.modifier_add(type='COLLISION')
bpy.context.object.collision.thickness_outer = 0.2
bpy.context.object.collision.thickness_inner = 0.6
$\endgroup$
1
  • $\begingroup$ Thank you for the answer. I have tried your solution but, I still have the same problem of simulations passing through the objects. I have changed my planes to cube and added the collision properties. I think, I am making a mistake by moving the planes in opposite direction using x co-ordinate(my_handler function). This has to be done using some force so that the objects in the scene respond to the forces than placing the object using the co-ordinate positions. Is there a way to do that? $\endgroup$
    – St1id3r
    Commented Feb 14, 2015 at 18:57

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .