Description
Describe the issue
Hello guys,
i would like to use the bproc.object.sample_poses() function to arrange my objects without collisions to run the physics simulation afterwards. When ich use my "default" objects everything works fine. As soon as i add to an object a child object an error occurs. Some models for example are in the .zip archive, because git don't support .blend files.
The error:
Could not place Cube without a collision.
Error: Python: Traceback (most recent call last):
File "/Users/eriktzschoppe/Documents/Masterarbeit/datengenerierung/pipeline.py", line 104, in
bp.object.sample_poses(instrument_model, sample_pose_func=sample_pose)
File "/Users/eriktzschoppe/BlenderProc/blenderproc/python/object/ObjectPoseSampler.py", line 76, in sample_poses
no_collision = CollisionUtility.check_intersections(obj, bvh_cache, cur_objects_to_check_collisions, [])
File "/Users/eriktzschoppe/BlenderProc/blenderproc/python/utility/CollisionUtility.py", line 50, in check_intersections
intersection, bvh_cache = CollisionUtility.check_mesh_intersection(obj, collision_obj,
File "/Users/eriktzschoppe/BlenderProc/blenderproc/python/utility/CollisionUtility.py", line 162, in check_mesh_intersection
inter = CollisionUtility.is_point_inside_object(obj1, obj1_BVHtree,
File "/Users/eriktzschoppe/BlenderProc/blenderproc/python/utility/CollisionUtility.py", line 199, in is_point_inside_object
p2 = nearest - point
AttributeError: Vector subtraction: (NoneType - Vector) invalid type for this operation
Thanks!
Minimal code example
import blenderproc as bp
import numpy as np
import bpy
import os
bp.init()
def load_blender_files_from_path(data_path):
instruments = []
file_name = []
for name in os.listdir(data_path):
if name.endswith(".blend"):
file_name.append(os.path.join(data_path, name))
for i in range(len(file_name)):
objs = file_name[i]
tmp = bp.loader.load_blend(objs, obj_types=['MESH'])
checker = False
for parts in tmp:
if 'part' in parts.get_name():
checker = True
print(checker)
if checker is True:
for counter, parts in enumerate(tmp):
if 'part' in parts.get_name():
tmp_move_part = counter
elif 'part' and 'kp' not in parts.get_name():
tmp_rigid_part = counter
if 'nadel_halter' in parts.get_name():
max_rotation = 15
else:
max_rotation = 55
rotation = 30 #np.random.uniform(0, max_rotation, 1)
tmp[tmp_move_part].set_rotation_euler([0, 0, np.deg2rad(rotation)])
# get all parent objects
key_points = tmp[tmp_move_part].get_children()
for key_point in key_points:
# set new parent to rigid part
key_point.set_parent(tmp[tmp_rigid_part])
tmp[tmp_rigid_part].join_with_other_objects([tmp[tmp_move_part]])
instruments.extend([tmp[tmp_rigid_part]])
else:
for counter, parts in enumerate(tmp):
if 'kp' not in parts.get_name():
adult_id = counter
key_points = tmp[adult_id].get_children()
for key_point in key_points:
key_point.set_parent(tmp[adult_id])
instruments.extend([tmp[adult_id]])
return instruments
def sample_pose(obj: bp.types.MeshObject):
obj.set_location(np.random.uniform([-0.05, -0.05, 0], [0.05, 0.05, 0]))
obj.set_rotation_euler(bp.sampler.uniformSO3())
instrument_model = load_blender_files_from_path(data_path)
bp.object.sample_poses(instrument_model, sample_pose_func=sample_pose)
Files required to run the code
Expected behavior
Place the objects without collision.
BlenderProc version
2.7.0