def gen_submesh(verts, faces, rgba=[1, 0, 0, 1]): """ TODO 20201202: replace pandanode with trimesh :param verts: np.array([[v00, v01, v02], [v10, v11, v12], ...] :param faces: np.array([[ti00, ti01, ti02], [ti10, ti11, ti12], ...] :param color: rgba :return: author: weiwei date: 20171219 """ # gen vert normals vertnormals = np.zeros((len(verts), 3)) for fc in faces: vert0 = verts[fc[0], :] vert1 = verts[fc[1], :] vert2 = verts[fc[2], :] facenormal = np.cross(vert2 - vert1, vert0 - vert1) vertnormals[fc[0], :] = vertnormals[fc[0]] + facenormal vertnormals[fc[1], :] = vertnormals[fc[1]] + facenormal vertnormals[fc[2], :] = vertnormals[fc[2]] + facenormal for i in range(0, len(vertnormals)): vertnormals[i, :] = vertnormals[i, :] / np.linalg.norm( vertnormals[i, :]) geom = da.pandageom_from_vvnf(verts, vertnormals, faces) node = GeomNode('surface') node.addGeom(geom) surface_nodepath = NodePath('surface') surface_nodepath.attachNewNode(node) surface_nodepath.setColor(rgba[0], rgba[1], rgba[2], rgba[3]) surface_nodepath.setTransparency(TransparencyAttrib.MDual) surface_nodepath.setTwoSided(True) surface_sgm = StaticGeometricModel(surface_nodepath) return surface_sgm
def gen_cdmesh_vvnf(vertices, vertex_normals, faces, name='auto'): geom = da.pandageom_from_vvnf(vertices * SCALE_FOR_PRECISION, vertex_normals, faces) bullet_triangles_mesh = BulletTriangleMesh() bullet_triangles_mesh.addGeom(geom) bullet_triangles_shape = BulletTriangleMeshShape(bullet_triangles_mesh, dynamic=True) bullet_triangles_shape.setMargin(0) geombullnode = BulletRigidBodyNode(name=name) geombullnode.addShape(bullet_triangles_shape) return geombullnode