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

    Is an object facing the camera?

    Scheduled Pinned Locked Moved PYTHON Development
    3 Posts 0 Posters 371 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 05/09/2017 at 15:08, xxxxxxxx wrote:

      I'm trying to find out if an object is facing the camera. By facing, I mean that the Z axis of the object is roughly pointing to the direction of the camera.
      I'm using this code:

        
      def main() :   
          rbd = doc.GetRenderBaseDraw()   
          cam = rbd.GetSceneCamera(doc)   
          if cam is None: cam = rbd.GetEditorCamera()   
             
          obj=op.GetObject()   
             
          mt_cam=cam.GetMg()   
          mt_obj=obj.GetMg()   
             
          hpb_cam=c4d.utils.MatrixToHPB(mt_cam,c4d.ROTATIONORDER_DEFAULT)   
          hpb_obj=c4d.utils.MatrixToHPB(mt_obj,c4d.ROTATIONORDER_DEFAULT)   
             
          hpb_cam.Normalize()   
          hpb_obj.Normalize()   
        
          dot=hpb_cam.Dot(hpb_obj)   
          print dot   
      

      But it is not working.
      It should be simple. How can I make it work?

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

        On 06/09/2017 at 03:28, xxxxxxxx wrote:

        Hi Rui Batista, thanks for writing us.

        With reference to your support request I think the script below should work as expected:

          
        import c4d  
          
        def main() :  
          rbd = doc.GetRenderBaseDraw()  
          if rbd is None:  
              return  
            
          cam = rbd.GetSceneCamera(doc)  
          if cam is None:  
              return   
            
          # define the evaluation tolerance  
          tol = 1e-2  
            
          # retrieve camera position and camera z-axis  
          camPos = cam.GetMg().off  
          camV3 = cam.GetMg().v3.GetNormalized()  
            
          # loop throught the objects in the scene  
          obj = doc.GetFirstObject()  
          while obj is not None:  
              # just skip camera objects  
              if obj.GetType() == c4d.Ocamera:  
                  obj = obj.GetNext()  
                  continue  
                
              #retrieve obj pos and obj z-axis  
              objPos = obj.GetMg().off  
              objV3 = obj.GetMg().v3.GetNormalized()  
            
              # compute the obj/cam direction  
              ocDir = c4d.Vector(objPos - camPos).GetNormalized()  
                
              # evaluate if obj/cam dir and obj z-axis are aligned  
              objZAxisAlignedWithObjCamDir = abs(objV3.Dot(ocDir) + 1 ) < tol  
              # evaluate if obj/cam dir and cam z-axis are aligned  
              camZAxisAlignedWithObjCamDir = abs(camV3.Dot(ocDir) - 1 ) < tol  
                
              # if both their z-axis are aligned they are looking each other  
              if objZAxisAlignedWithObjCamDir and camZAxisAlignedWithObjCamDir:  
                  print  obj.GetName() + " is looking at "+ cam.GetName()  
                
              # go next/down  
              tempObj = obj  
              obj = obj.GetDown()  
              if obj is None:  
                  obj = tempObj.GetNext()  
          
        if __name__=='__main__':  
          main()  
        

        On top of that i warmly recommend not to normalize a vector representing rotation angles.

        Best, Riccardo

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

          On 06/09/2017 at 05:06, xxxxxxxx wrote:

          Thank you so much, Riccardo.
          I adapted it to my needs and it worked great.

          1 Reply Last reply Reply Quote 0
          • First post
            Last post