Set the "DrawCircle" orientation to face camera



  • Hello,

    How to set the orientation of "DrawCircle" to face the camera like in Orientation Property of Null Object.

    info = c4d.HandleInfo()
    # Defines the position and the size of the circle
    circleSettings = bh.GetMg()
    circleSettings.off = info.position
    circleSettings.v1 *= 20
    circleSettings.v2 *= 20
    circleSettings.v3 *= 20
    
    # Draw the Circle
    bd.DrawCircle(circleSettings)
    

    Thank you.



  • Hello,

    as always, please mark your post as a question.

    Can you share a little more information about what you are actually doing? What is the context of the code you provided?

    If you want to draw a circle in screen space, the easiest thing would be to just draw a 2D circle using DrawCircle2D().

    # This example draws a 2D line, circle and point.
    
    bd.SetMatrix_Screen()
    
    center = c4d.Vector(100.0, 100.0, 0)
    tangentPoint = c4d.Vector(150.0, 100.0, 0)
    
    # draw line and circle
    bd.SetPen(c4d.Vector(0.8))
    bd.DrawLine2D(center, tangentPoint)
    bd.DrawCircle2D(center.x, center.y, tangentPoint.x - center.x)
    
    # draw point
    bd.SetPen(c4d.Vector(1.0))
    bd.DrawPoint2D(center)
    
    
    bd.SetMatrix_Matrix(None, c4d.Matrix())
    

    best wishes,
    Sebastian



  • @s_bach
    Hello,
    I want use it on the ObjectData.Draw() function.

    Here is the full code:

    def Draw(self, op, drawpass, bd, bh):
        if drawpass != c4d.DRAWPASS_HANDLES:
            return c4d.DRAWRESULT_SKIP
    
        bd.SetMatrix_Matrix(op, bh.GetMg())
        hitid = op.GetHighlightHandle(bd)
    
        for i in xrange(self.GetHandleCount(op)):
    
            color = c4d.GetViewColor(c4d.VIEWCOLOR_SELECTION_PREVIEW) if i == hitid else c4d.GetViewColor(c4d.VIEWCOLOR_ACTIVEPOINT)        
    
            bd.SetPen(color)
    
            info = c4d.HandleInfo()
            self.GetHandle(op, i, info)
    
            bd.DrawHandle(info.position, c4d.DRAWHANDLE_BIG, 0)
    
            bd.SetMatrix_Matrix(op, bh.GetMg())
    
            circleSettings = bh.GetMg()
            circleSettings.off = info.position
            circleSettings.v1 *= 20
            circleSettings.v2 *= 20
            circleSettings.v3 *= 20
    
            bd.DrawCircle(circleSettings)
        
            return c4d.DRAWRESULT_OK
    

    Thank you.



  • hello,

    using this to draw a circle at op position. You can use your handle position instead.
    The main point is retrieving the view matrix with bd.GetMg() to have you Y and X vectors lined with the view.

           if drawpass == c4d.DRAWPASS_OBJECT:
                rad = 20.0
                bd.SetMatrix_Matrix(op, c4d.Matrix());
                m = bd.GetMg();
                m.off = bh.GetMg().off;
                m.v3 = c4d.Vector(0.0);
                m.v1 *= rad;
                m.v2 *= rad;
                bd.DrawCircle(m);
                return c4d.DRAWRESULT_OK
    

    Cheers,
    Manuel



  • @m_magalhaes
    Thank you. I made some changes but its work!

    Cheers,
    Mustapha