Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    how to speed up c4d.utils.GeRayCollider()

    Scheduled Pinned Locked Moved PYTHON Development
    1 Posts 0 Posters 115 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      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 /////////////////////////////////////////////////////////////////////////////////////
      
      1 Reply Last reply Reply Quote 0
      • First post
        Last post