Turn Bezier spline to linear spline
-
Dear c4d fellows,
I wonder, if there is a buit in method in SplinObject to turn Bezier spline into interpolating linear spline.
Of course, it is simple to code my own function doing exactly this, but may be it is already implemented by c4d creators.Yaroslav.
-
Yes, you can simply set the Interpolation parameter to linear. See here
-
Hi @Yaroslav,
thank you for reaching out to us and thank you @mp5gosu for providing an answer.
However, and I might be mistaken here, I think this is not what @Yaroslav was asking for; feel free to correct me when I am wrong. Cinema's splines are all parametric, even the editable ones, so changing the interpolation type from
SPLINEOBJECT_TYPE_BEZIER
toSPLINEOBJECT_TYPE_LINEAR
will give you something linear, but also a vastly different curve geometry (depending on the input).To resample a spline in Python, you can use
c4d.utils.SplineHelp
, specificallySplineHelp.GetPosition()
. Or you can useSplineHelp.GetLineObject()
to get the underlyingLineObject
of a spline. In C++ you also haveSplineObject::GetLineObject
.In case you are actually interested in changing the interpolation type of a spline object (and not resample it), then @mp5gosu did provide the correct answer for you.
Please also note that we require postings to be tagged with essential meta information regarding the OS, Cinema 4D version and programming environment for the question. You can read more about the tagging feature here.
Cheers,
Ferdinand -
Oh well yes @ferdinand .I was assuming the simpliest way.
-
Dear Ferdinand, thank you for
the comprehensive answer!(Dear mp5gosu, thank you for your comment too)
Dear Ferdinand, I develop plugin in c++ (using vs2019 and c4d r20) and this is precisely what I meant.
Instead of using beautiful and smooth bezier-curved type splines I want to substitute them with finely approximated linear splines (and I guess SplineObject::GetLineObject is precisely the function I need.) I wonder if there is some control on the number of linear segments approximating the spline. Hopefully, I can get it from the corresponding class declaration.Yaroslav.
-
Ferdinand,
just triedLineObject* spline_linear = spline->GetLineObject(document, precision);
Works like a charm. The closer float "precision" to one the better the approximation, as far as I understand.
One thing, that confuses me is that new object appear in c4d menus with little white"question mark" sign (see picture).
I don't undersytand why.Here is my piece of code:
LineObject* spline_linear = spline->GetLineObject(document, 0.9); document->InsertObject(spline_linear, NULL, NULL, 0); // Add it to the OM spline_linear->Message(MSG_UPDATE);
Oh, I see. Now I can extract all the points from this LineObject and construct a simple linear spline if I need one.
I guess cinema4d doesn't recognize the LineObject. Hence, question mark in menus. -
Hi @Yaroslav,
yes, you are right,
LineObject
are not meant to be presented to the user directly, but are the underlying discrete geometry of a spline. In case you do not mind a little overhead, you can also useSendModelingCommand
, specifically withMCOMMAND_CURRENTSTATETOOBJECT
(link to example), to get "a linear version of the spline". The advantage here is that you do not have to worry so much about the details, but at the cost of a little bit of overhead.Cheers,
Ferdinand -
@ferdinand
Oh, thanks!
Quite a nice idea!