Is an object facing the camera?

  • 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()   
        print dot   

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

  • 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:  
      cam = rbd.GetSceneCamera(doc)  
      if cam is None:  
      # 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()  
          #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__':  

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

    Best, Riccardo

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

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

Log in to reply