counterpart of GetPointIndex ?
-
On 09/11/2013 at 11:07, xxxxxxxx wrote:
User Information:
Cinema 4D Version: r14
Platform:
Language(s) : C++ ;---------
Hi there,i'd like to get the position along a spline for a specific point. looks like i need the counterpart for GetPointIndex. is there a function for this?
-
On 10/11/2013 at 03:09, xxxxxxxx wrote:
Hi ello,
this question was asked quite recently in the Python forum.
https://developers.maxon.net/forum/topic/7511/9397_percentage-offsets-of-interpolation-points
Best,
-Niklas -
On 11/11/2013 at 03:55, xxxxxxxx wrote:
thank you
-
On 13/11/2013 at 11:53, xxxxxxxx wrote:
Hey, i need to get back on this as i am having problems using it. how can i get the spline position?
LONG *seg; LONG *ind; Real *offset; baseSplineHelp->GetSplinePointSegment(i,offset,ind,seg);
but, how do i access the offset now? when i try to GePrint it i get an error "cannot convert parameter 1 from 'LReal *' to 'LReal'" for obvious reason, but the question is where is the accessible offset for me?
aside from this, i guess i am doing it wrong anyway. is there any example on how to get the offset for point x on a spline?
-
On 13/11/2013 at 14:36, xxxxxxxx wrote:
When you see pointers used in SDK functions like this: void GetSplinePointSegment(LONG index, Real* offset, LONG* ind, LONG* segment).
It means that those parameters are placeholder pointer references to variables that will get filled in with data by the function.Like this:
LONG seg; LONG ind; Real offset; baseSplineHelp->GetSplinePointSegment(i, &offset, &ind, &seg);
This is a somewhat common technique used throughout in the C4d C++ SDK.
Where you first create some empty variables....Then you execute a function that has these same variables in it's parameters. Which are pointing to the variables, and then assigning values to them.You gotta love this C++ pointer stuff.
-ScottA
-
On 13/11/2013 at 23:08, xxxxxxxx wrote:
ah, thank you! just didn't know that * and & stuff was the same. already use the &
-
On 14/11/2013 at 03:47, xxxxxxxx wrote:
ok, still got a message. when i have for example a spline with three points (-100,0,0) / (0,0,0) / (100,0,0) i thought that the offset for the second point would be 0.5, but it is actually 0.333
why??AutoAlloc <SplineHelp> splineHelp; if (!splineHelp) return false; splineHelp->InitSpline(spline,Vector(0),0,0,1,1,0); LONG seg; LONG ind; Real offset; splineHelp->GetSplinePointSegment(i, &offset, &ind, &seg); GePrint(RealToString(offset));
-
On 14/11/2013 at 09:17, xxxxxxxx wrote:
I've only briefly explored the spline classes myself. So I'm not sure if any of this code will help or not.
This is the code from a tag plugin I wrote that moves an object along a spline :
//This tag plugin works similar to the Align-to-Spline tag in C4D //Except my tag gets put on a spline object. And the object traveling along it gets dropped into the tag's linkfield EXECUTIONRESULT MyTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags) { BaseContainer *tagdata = tag->GetDataInstance(); //Get the data in the tag and assign it to a variable BaseObject *obj = tag->GetObject(); //Get the object the tag is on if (!obj) return EXECUTIONRESULT_USERBREAK; //Only work if the object the tag is on is a spline type (all types of splines) if(!obj->GetInfo()&OBJECT_ISSPLINE) return EXECUTIONRESULT_USERBREAK; //I used a linkfield gizmo to store the object that will move along the spline BaseObject *target = tagdata->GetObjectLink(MY_LINK,doc); if(target) //If the linkfield is not empty { //Gets the position of the object in the link field Vector position = target->GetRelPos(); //Convert the object the tag is on to a spline type SplineObject *myspline = ToSpline(obj); SplineLengthData *sld = SplineLengthData::Alloc(); sld->Init(myspline, 0, NULL); if (!sld) return EXECUTIONRESULT_USERBREAK; SplineHelp *sh = SplineHelp::Alloc(); if (!sh) return EXECUTIONRESULT_USERBREAK; sh->InitSpline(myspline, 0.0, FALSE, TRUE, FALSE, FALSE); LONG segment = 0; //NOTE:If the spline is a Primitive...only segment 0 works Real PosOnSpline = tag->GetData().GetReal(MYNUMERIC); //The position the object is along the spline's segment Vector splinepos = sh->GetPosition(PosOnSpline, segment, TRUE); sh->FreeSpline(); target->SetRelPos(Vector(splinepos.x,splinepos.y,splinepos.z)); //Moves the object along the spline target->Message(MSG_UPDATE); } return EXECUTIONRESULT_OK; }
These are a few examples that I've created in my notes about how to use some of the various spline functions in the SDK:
//This code gets the global position of a spline's point + an offset value BaseObject *obj = doc->GetActiveObject(); if (!obj) return FALSE; SplineObject *myspline = ToSpline(obj); SplineLengthData *sld = SplineLengthData::Alloc(); sld->Init(myspline,0,NULL); if (!sld) return FALSE; SplineHelp *sh = SplineHelp::Alloc(); if (!sh) return FALSE; sh->InitSpline(myspline, 0.0, FALSE, TRUE, FALSE, FALSE); Real offsetValue = 10.5; Real offset = sh->GetOffsetFromUnit(offsetValue, 0); //Real offset = sh->GetOffsetFromReal(offsetValue, 0); //Get the global position of the first spline point + the offset Vector p0 = sh->GetPosition(offset,0,TRUE,TRUE); //Vector p0 = sh->GetPosition(sld->UniformToNatural(offset), 0, TRUE, TRUE); GePrint(RealToString(p0.x)); //This code gets the offset, and segment values for the points in a selected spline object //It calculates the distance the "offset" variable is from the first spline point //NOTE: The offset values never change no matter where the points are placed(results are local..not global) // Example: offset = 0.5; is always the middle of the spline. No matter how the spline looks BaseObject *obj = doc->GetActiveObject(); //The active object should be a spline object if (!obj) return FALSE; SplineObject *myspline = ToSpline(obj); //Convert the type to a spline type so we can work on it //Create the SplineHelp class for the spline so we can use it's methods SplineHelp *sh = SplineHelp::Alloc(); if (!sh) return FALSE; sh->InitSpline(myspline, 0.0, FALSE, TRUE, FALSE, FALSE); Real offset = 0.5; //The position along the spline. The range is: 0.0 - 1.0 //The values for these 2 variables are filled in by the GlobalToLocal() function Real off; //This value will match the value set with the "offset" variable above LONG segment; sh->GlobalToLocal(offset, &off, &segment, FALSE); GePrint("offset: " + RealToString(off) + " " + "segment: " + LongToString(segment)); //This code gets the index, offset, and segment values for the points in a selected spline object //The code calculates results based upon how many points in the spline. In relation to how long the spline length is //It calculates the offset distance each point is from the first spline point //NOTE: The offset values never change no matter where the points are placed(results are local..not global) BaseObject *obj = doc->GetActiveObject(); //The active object should be a spline object if (!obj) return FALSE; SplineObject *myspline = ToSpline(obj); //Convert the type to a spline type so we can work on it //Create the SplineHelp class for the spline so we can use it's methods SplineHelp *sh = SplineHelp::Alloc(); if (!sh) return FALSE; sh->InitSpline(myspline, 0.0, FALSE, TRUE, FALSE, FALSE); LONG count = myspline->GetPointCount(); for(LONG i=0; i<count; i++) { LONG index = i; //Check each of the spline's index points //The values for these 3 variables are filled in by the GetSplinePointSegment() function LONG ind; Real offset; LONG segment; sh->GetSplinePointSegment(index, &offset, &ind, &segment); GePrint("index: " + LongToString(ind) + " " + "offset: " + RealToString(offset) + " " + "segment: " + LongToString(segment)); }
Maybe the code in these examples will help you.
-ScottA
-
On 14/11/2013 at 12:12, xxxxxxxx wrote:
thank you very much for those. much appreciated. still, i am not able to get the desired results. 0.333 is not what i think should be returned in my test-case. hopefully someone has an idea. in the end i want to get the position of points around a spline point at a certain distance (e.g. 0.01 left and right from the spline point)...