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).
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.
SetTangent
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
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).
MCOMMAND_SPLINE_SOFTINTERPOLATION
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
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!