Hello, I am testing create_collision_sphere_generator() in CollisionSphereGenerator class. It needs vertices and triangles as inputs.
I can use get_mesh_vertices_relative_to() to get all vertices of a mesh. But how can I get the correspond triangles in the collider?
You can install external python packages, like trimesh. Then create a trimesh sphere like:
ico = trimesh.creation.icosphere(2)
faces = ico.faces
vertices = ico.vertices
face_vertex_count = np.ones(faces.shape[0], dtype=np.int64) * 3
Then create a sphere via omniverse:
def create_sphere(manual_sphere_path, vertices, face_vertex_count, faces,
steel_density, position, velocity):
convexGeom = UsdGeom.Mesh.Define(stage, manual_sphere_path)
convexPrim = stage.GetPrimAtPath(manual_sphere_path)
convexGeom.CreatePointsAttr(vertices)
convexGeom.CreateFaceVertexCountsAttr(face_vertex_count)
convexGeom.CreateFaceVertexIndicesAttr(faces)
contactReportAPI = PhysxSchema.PhysxContactReportAPI.Apply(convexPrim)
mass_api_sphere = UsdPhysics.MassAPI.Apply(stage.GetPrimAtPath(manual_sphere_path))
omni.kit.commands.execute('TransformMultiPrimsSRTCpp',
count=1,
paths=[manual_sphere_path],
new_translations=[position[0], position[1], position[2]],
new_rotation_eulers=[0.0, -0.0, 0.0],
new_rotation_orders=[0, 1, 2],
new_scales=[1.0, 1.0, 1.0],
old_translations=[0.0, 0.0, 0.5],
old_rotation_eulers=[0.0, -0.0, 0.0],
old_rotation_orders=[0, 1, 2],
old_scales=[1.0, 1.0, 1.0],
usd_context_name='',
time_code=0.0)
omni.kit.commands.execute('SetRigidBody',
path=Sdf.Path(manual_sphere_path),
approximationShape='convexHull',
kinematic=False)
omni.kit.commands.execute('ChangeProperty',
prop_path=Sdf.Path('{}.physxRigidBody:maxLinearVelocity'.format(manual_sphere_path)),
value=150.0,
prev=0.0,
usd_context_name=stage)
omni.kit.commands.execute('ChangeProperty',
prop_path=Sdf.Path('{}.physics:density'.format(manual_sphere_path)),
value=steel_density,
prev=0.0,
usd_context_name=stage)
omni.kit.commands.execute('ChangeProperty',
prop_path=Sdf.Path('{}.physxRigidBody:disableGravity'.format(manual_sphere_path)),
value=True,
prev=None,
usd_context_name=stage)
return
# Create spheres
sphere_path_00 = "/World/obj_00"
position_00 = [3.0, 0, 1.5]
velocity_00 = [-10, 0, 0]
create_sphere(sphere_path_00, vertices, face_vertex_count, faces,
steel_density, position_00, velocity_00)
After creation via this method, you can access the faces, face vertex counts, and vertices via:
convexGeom = UsdGeom.Mesh(stage.GetPrimAtPath(prim_path))
sphere_verts = np.array(convexGeom.GetPointsAttr().Get())
face_verts = np.array(convexGeom.GetFaceVertexIndicesAttr().Get())
face_vertex_count = np.array(convexGeom.GetFaceVertexCountsAttr().Get())
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.