Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
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?
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
On 06/09/2017 at 05:06, xxxxxxxx wrote:
Thank you so much, Riccardo. I adapted it to my needs and it worked great.