how to speed up c4d.utils.GeRayCollider()

On 06/03/2013 at 07:16, xxxxxxxx wrote:

Hello everybody,

So I have a working script which gets me the nearest object from an arbitrary start point.
I am happy with it, but the speed of calculating every object with every object caught me.

If the Object is lowpoly c4d.utils.GeRayCollider() is quiet fast (~1 ms, 1800 polys) but as soon as it gets a highpoly object to calculate it jumps up to high times (~552ms, 440000 polys).

I can't exclude the high poly objects hence I want to check for visibility.
Is it possible to speed up c4d.utils.GeRayCollider() even more somehow?
I guess I am fishing for help so that my coding marathon was not for nothing.

kind regards
mogh

# Ray stuff and nearest obj -------------------------------------------------------------------------------------   
def get_ray(start_obj, end_obj, goal) : #modified to accept vectors as start instead of object Global Mg   
    start = ~goal.GetMg() * c4d.Vector(start_obj)   
    end = ~goal.GetMg() * end_obj.GetMg().off   
    return {'ray_p' : start, 'ray_length' : (end - start).GetLength(), 'ray_dir' : (end - start).GetNormalized()}   
  
def firerayat (start, direction, length, optemp_test) : # startpoint, direction, length, object to colide   
    collider = c4d.utils.GeRayCollider()       
    collider.Init(optemp_test) #force cache rebuild with , True       
    if collider.Intersect(start, direction, length) :         
        return collider.GetNearestIntersection()["distance"]   
       
def get_nearest_obj (start_point, target, obj_list, jump, overal_counter) :   
    micro_time_start = c4d.GeGetTimer()   
       
    temp_op_distance_list = [] #Reset   
    for obj_rows in obj_list:   
        micro_time_start_a = c4d.GeGetTimer()   
        overal_counter[0] += 1   
        ray = get_ray( start_point, target, obj_rows[0] ) # has to be calculated everytime hence we need the Matrix of the goal   
        distance = firerayat(ray['ray_p'], ray['ray_dir'], ray['ray_length'], obj_rows[0])   
        temp_op_distance_list.append([obj_rows[0] , distance])   
        print overal_counter[0], c4d.GeGetTimer() - micro_time_start_a, " ms internal"   
        
    try:   
        near_obj = min((e for e in temp_op_distance_list if e[1]), key = itemgetter(1))[0]   
        for i, row in enumerate(obj_list) :   
            if near_obj in row:   
               obj_list[i][2] += 1 # increment the hitcounter   
    except ValueError:   
        near_obj = None   
    print c4d.GeGetTimer() - micro_time_start, " ms"   
# End ray /////////////////////////////////////////////////////////////////////////////////////