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

    Convert Joints to Spline (Limited to only 2 with Bezier Handles)

    Cinema 4D SDK
    r20 python
    2
    3
    770
    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.
    • B
      bentraje
      last edited by bentraje

      Hi,

      Is there a way to convert joints to spline (limited to only 2 with Bezier Handles). By default, the joint to spline default C4D command convert them point by point per joint.

      My main problem is what values to plug in the SetTangent method so that the spline will conform to the previous shape despite only having two positions.

      Is there a way around this?

      Thank you

      Here is an illustration of what I am after:
      https://www.dropbox.com/s/9riwmyevlq9g6gl/c4d083_convert_joints_to_spline.jpg?dl=0

      If you want the actual file you can check it here:
      https://www.dropbox.com/s/gx5yylf2b423irh/c4d083_convert_joints_to_spline.c4d?dl=0

      Here is my code so far:

      import c4d
      from c4d import gui
      #Welcome to the world of Python
      
      def GetNextObject(op):
          if op==None:
              return None
        
          if op.GetDown():
              return op.GetDown()
         
          return op.GetDown()
       
      def IterateHierarchy(op):
          if op is None:
              return
       
          count = 0
          objList = []
        
          while op:
              count += 1
              objList.append(op)
              op = GetNextObject(op)
              
          return objList
      
      def createSpline(numPoints, pointPosition):
          
          spline = c4d.BaseObject(c4d.Ospline)
          spline.ResizeObject(numPoints)
          
          for point in range(numPoints):
              spline.SetPoint(point, pointPosition[point])
          
      
          spline[c4d.SPLINEOBJECT_CLOSED] = False
          spline.Message(c4d.MSG_POINTS_CHANGED)
          
          doc.InsertObject(spline)    
          c4d.EventAdd()
      
      
      objList = IterateHierarchy(op)
      
      objLen = len(objList) 
      objListPosition = []
       
      for obj in objList:
          objListPosition.append(obj.GetMg().off)
              
      
      createSpline(objLen, objListPosition)
               
      

      Thanks to the C4D documentation for the iterate codes and the Scott Ayers to the Create Spline code

      1 Reply Last reply Reply Quote 0
      • r_giganteR
        r_gigante
        last edited by r_gigante

        Hi Bentraje, thanks for reaching out us.

        With regard to your request, there's no immediate and correct answer here since it's more an algorithm related question that a real API one.
        If more than 2CV-based curve is allowed Cinema provides the FitCurve function which, given a certain threshold value and a set of points, returns an interpolating spline and also MCOMMAND_SPLINE_SOFTINTERPOLATION which, as written in docs, just return a soft-interpolation of a curve passing through points (auto-smooth tangents).

        With regard to setting the tangents at the start and end points, it's pretty correct to state that the direction is the one defined by the first and the end joints but the magnitude of these tangents can be arbitrary and based on the actual shape of the curve you want to approximate.

        Finally if a 2CV-only Bezier curve is allowed, I think that it might not suffice to represent an arbitrary curve in the space or to properly interpolate a set of points in space.
        For this reason I warmly recommend to search for interpolate point bezier and see for the results brought out. I'm sure there will be plenty of stuff from which get inspired.

        Best, Riccardo

        B 1 Reply Last reply Reply Quote 2
        • B
          bentraje @r_gigante
          last edited by

          HI @r_gigante

          Thanks for the response.
          With regard to 2CV-only Bezier curve: Yes, I only need 2 CV maximum. I understand that it will not interpolate complicated shapes properly but as you can see in my example, it's only a simple shape.

          Looking at it now. I have a feeling I am biting more than I can chew. I'm not sure I can solve it at the moment given my current knowledge.

          Will just perform it manually at the moment.

          Anyhow, thanks for responding.

          Have a great day ahead!

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