Hola César. Hay un detalle cuando defines la propiedad rotation de un nodo, y es que está asignación es interpretada en coordenadas de transformación globales, por lo tanto estarías rotando el objeto con respecto al origen, para rotarlo con respecto a sí mismo tendrías que hacerlo de esta forma:
Código:
in cordsys each each, rotation = myspline, rotation
Pero en esto no se encuentra el problema que mencionas sobre las rotaciones sobrescritas, lo que sucede en el caso de los helpers de un Spline IK Control es que el modificador define las posiciones y las rotaciones de estos helpers en el momento en el que el visor se actualiza, al tener todo el código entre paréntesis el visor no se actualizara hasta que se ejecute todo lo que está allí dentro, por lo tanto todas las transformaciones que realices serán sobrescritas al final, extrañamente a excepción de los helpers que se encuentren en el origen (como el primero).
Si, por ejemplo, cambiaras las posiciones de los helpers dentro de ese pedazo de código (no necesariamente dentro de un loop) al final también serían sobrescritas.
Si quitaras los paréntesis te funcionaria ya que el visor se actualiza por cada línea de código ejecutada globalmente, pero obviamente esto no será posible en todos los casos.
Hay dos formas de solucionarlo, la primera seria poner un Redraw All Views() después de que creas los helpers en el splineikcontrol, y la otra seria crear los helpers manualmente, alinearlos a los vértices del Spline y luego asignarlos al splineikcontrol.
Código:
Fn createspline pospoints = -retorna una Spline usando las coordenadas del array pospoint.
(Tlocal ss = splineshape Pos pospoints[1]) taddnewspline ss tfor each in pospoints do t(t addknot ss 1 #smooth #curve each t) tupdateshape ss treturn ss).
(Tlocal myspline = createspline #([0,0,0], [50,0,0], [100,0,0]) -creo una Spline tmyspline, rotation, z_rotation = 45 taddmodifier myspline (Spline IK control()) -agregamos un modificador Spline IK control tlocal splinemod = myspline. Modifiers[1] tsplinemod, linktypes = 2 -los helpers no van enlazados entre sí tsplinemod, createhelper (numknots myspline) -creamos los helpers que controlanran la curva tRedraw All Views() t-atencion:
-supongamos que quiero igualar la orientación de los t-controles creados mediante el modificador con la Spline tfor each in splinemod, helper_list do t(t in cordsys each each, rotation = myspline, rotation -igualamos la rotación con la Spline print (each, name + : + each, rotation as string) -dejamos un log para comprobar posteriormente t).
)
Método de creación manual de helpers:
Código:
Fn createspline pospoints = -retorna una Spline usando las coordenadas del array pospoint.
(Tlocal ss = splineshape Pos pospoints[1]) taddnewspline ss tfor each in pospoints do t(t addknot ss 1 #smooth #curve each t) tupdateshape ss treturn ss).
(Tmyspline = createspline #([10,0,0], [50,0,0], [100,0,0]) -creo una Spline tmyspline, rotation, z_rotation = 45 taddmodifier myspline (Spline IK control()) -agregamos un modificador Spline IK control tsplinemod = myspline. Modifiers[1] t-se crean los helpers y se alinean con los vértices thelperarray=#() tfor i=1 todo (numknots myspline) do t(t append helperarray (point Pos getknotpoint myspline 1 i)) t) t-se agregan los vértices al Spline IK control tsplinemod, helper_list=helperarray t-se alinean las rotationes tfor each in splinemod, helper_list do t(t in cordsys each each, rotation=myspline, rotation t).
)