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
    • Recent
    • Tags
    • Users
    • Login

    GeRayCollider

    Scheduled Pinned Locked Moved PYTHON Development
    3 Posts 0 Posters 389 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 29/10/2013 at 07:39, xxxxxxxx wrote:

      Hello,
      I used the function GeRayCollider() in a plugin. But I have a few problems.
      First I created a cube.
      Then I  tried to initialize the ray collider with this cube.
      But I got an error message, that the argument must be a polygon object.
      So I tried to convert the cube to a polygonobject.
      I used a call command for this and it works (I can see the polygon object in cinema 4d), but the error message is the same.
      Here ist the code:

        
      import c4d  
      import os, sys  
      import time  
      import math  
      from c4d import plugins  
      from c4d import utils  
      from config import PLUGIN_ID
       
      class CommandDataExecute(plugins.CommandData) :  
            
          dialog = None
          #plugin started by user  
          def Execute(self, doc) :  
               
              cube = c4d.BaseObject(c4d.Ocube)  
              doc.InsertObject(cube)  
              c4d.EventAdd()  
              cube.SetBit(c4d.BIT_ACTIVE)  
              print "Typ: ", cube.GetType()  
              c4d.CallCommand(12236)  
              c4d.EventAdd()  
              print "Typ: ", cube.GetType()      
              ray=c4d.utils.GeRayCollider()  
              if not ray.Init(cube) :  
                  print "Initialisierung nicht erfolgreich"  
              else:  
                  start = c4d.Vector(400,0,0)  
                  end = c4d.Vector(-400,0,0)  
                  direction = c4d.Vector(-1,0,0)  
                  length = 800  
                  print "globale matrix cube: ", cube.GetMg()  
                  print "radius of the bounding box: ", cube.GetRad()  
                  does_intersect = ray.Intersect(start, direction, length)  
                  print "Intersection? ", does_intersect  
              return True  
              
      

      Now I have four questions:
      1. Is it necessary to convert the cube to a polygon object?
      2. Is there a better way to convert the cube than using call commands?
      3. Why doesnt the function "ray.Init(cube)" work?
      4. "does_intersect = ray.Intersect(start, direction, length)" should return true. Did I use the function correctly?
       
      Thanks for your comments.
      Conny

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 29/10/2013 at 10:10, xxxxxxxx wrote:

        1. yes
        2. yes two ways - a. grabbing the cache of the object (with is not an option in your scenario) and b. using the SMC method (SendModellingCommand). 
        3. The reason is most likely the CallCommand() if you want to use CallCommand() you will have to use the force (Cache) parameter of the method. And even then i wouldn't be so sure if it will work (the usual threading mess with c4ds main thread).
        4. depends on what you were trying to do, but basically yes.

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 12/11/2013 at 07:27, xxxxxxxx wrote:

          Thank you. The SMC method works.
          But now I have a problem with the intersection.
          In the following example I created two cubes and for each of them a GeRayCollider (ray1 and ray2).
          ray1 intersects cube 1 in one point. But I get two intersections in the same point.
          Although ray 2 doesn't intersect cube2 I get the same two intersections as with ray1.
          I expected that the function ray2.Intersect() only returns true, if there is an intersection with cube2. 
          Can someone explane me that?

            
          import c4d  
          import os, sys  
          import time  
          import math  
          from c4d import plugins  
          from c4d import documents  
          from c4d import utils  
          from config import PLUGIN_ID
            
          class CommandDataExecute(plugins.CommandData) :  
                
              dialog = None
              #plugin started by user  
              def Execute(self, doc) :  
                  doc = documents.GetActiveDocument()  
                   
                         
                 #create two cubes and convert them to polygon objects  
                   
                  cube1 = c4d.BaseObject(c4d.Ocube)  
                  cube2 = c4d.BaseObject(c4d.Ocube)  
                  off = c4d.Vector(-300,0,0)  
                  v1 = c4d.Vector(1,0,0)  
                  v2 = c4d.Vector(0,1,0)  
                  v3 = c4d.Vector(0,0,1)  
                  matrix=c4d.Matrix(off, v1, v2, v3)  
                    
                  cube2.SetMg(matrix)  
                  doc.InsertObject(cube1)  
                  doc.InsertObject(cube2)  
                  c4d.EventAdd()  
                    
                  cube1.SetBit(c4d.BIT_ACTIVE)  
                  obj=doc.GetActiveObject()    
                  convert=c4d.utils.SendModelingCommand(command=c4d.MCOMMAND_MAKEEDITABLE , list=[obj], mode= c4d.MODELINGCOMMANDMODE_ALL, bc= c4d.BaseContainer(), doc = doc)  
                  doc.InsertObject(convert[0])  
                  c4d.EventAdd()  
                  cube1=convert[0]  
                    
                  cube2.SetBit(c4d.BIT_ACTIVE)  
                  obj=doc.GetActiveObject()    
                  convert=c4d.utils.SendModelingCommand(command=c4d.MCOMMAND_MAKEEDITABLE , list=[obj], mode= c4d.MODELINGCOMMANDMODE_ALL, bc= c4d.BaseContainer(), doc = doc)  
                  doc.InsertObject(convert[0])  
                  c4d.EventAdd()  
                  cube2=convert[0]  
                    
                    
                  #create GeRayCollider  
                  ray1=c4d.utils.GeRayCollider()  
                  ray2=c4d.utils.GeRayCollider()  
                    
                                 
                  start = c4d.Vector(0,0,-700)  
                  end = c4d.Vector(0,0,0)  
                  dir = end - start  
                  length = math.sqrt(dir.x*dir.x+dir.y*dir.y+dir.z*dir.z)  
                  direction=dir.GetNormalized()  
                  print "direction: ", direction  
                  print "length: ", length  
                  print "cube1: "  
                  if not ray1.Init(cube1) :  
                      print "Initialisierung nicht erfolgreich"  
                  else:  
                        
                      does_intersect1 = ray1.Intersect(start, direction, length)  
                      print "Intersection? ", does_intersect1  
                      j = ray1.GetIntersectionCount()  
                      print "Number of Intersections: ", j  
                      for k in range (0, j, 1) :  
                          print "Intersection ",k,": ", ray1.GetIntersection(k)  
                      print "----------------------------------------------"  
                      print "cube2: "  
                  if not ray2.Init(cube2) :  
                      print "Initialisierung nicht erfolgreich"  
                  else:  
                        
                      does_intersect2 = ray2.Intersect(start, direction, length)  
                      print "Intersection? ", does_intersect2  
                      j = ray2.GetIntersectionCount()  
                      print "Number of Intersections: ", j  
                      for k in range (0, j, 1) :  
                          print "Intersection ",k,": ", ray2.GetIntersection(k)  
                      print "----------------------------------------------"  
                 
                   
                  return True  
            
          
          1 Reply Last reply Reply Quote 0
          • First post
            Last post