Gracias Gracias:  1
Resultados 1 al 9 de 9

Tema: [MaxScript] Loop no retiene los cambios

  1. #1
    pythonized... Avatar de Cesar Saez
    Fecha de ingreso
    Mar 2004
    Ubicación
    Granada, España
    Mensajes
    3,765

    3dsmax [MaxScript] Loop no retiene los cambios?

    Hola, esta pregunta no se ni siquiera como plantearla, seguro le habrá pasado a muchos, me gustaría saber si existe alguna forma de solucionarlo más elegante que lo que vengo haciendo últimamente.

    El tema va así, algunas veces me sucede que al ejecutar una acción dentro de un loop/bucle por alguna razón ejecuta la línea pero no retiene los cambios. Es como si hiciera el cambio pero luego lo sobreescribe sin motivo aparente volviendo al valor original. No tiene sentido no?

    Dejo un ejemplo

    Código:
    fn createSpline posPoints = --retorna una spline usando las coordenadas del array posPoint
    (
    	local ss = SplineShape pos:(posPoints[1])
    	addNewSpline ss
    	for each in posPoints do
    	(
    		addKnot ss 1 #smooth #curve each
    	)
    	updateShape ss
    	return ss
    )
    (
    	local mySpline = createSpline #([0,0,0], [50,0,0], [100,0,0]) --creo una spline
    	mySpline.rotation.z_rotation = 45
    	
    	addModifier mySpline (spline_IK_control()) --agregamos un modificador splineIK control
    	local splineMod = mySpline.Modifiers[1]
    	splineMod.linkTypes = 2 --los helpers no van linkeados entre si
    	splineMod.createHelper (numKnots mySpline) --creamos los helpers que controlanran la curva
    	
    	--ATENCION:
    	--SUPONGAMOS QUE QUIERO IGUALAR LA ORIENTACION DE LOS
    	--CONTROLES CREADOS MEDIANTE EL MODIFICADOR CON LA SPLINE
    	
    	for each in splineMod.helper_List do
    	(
    		each.rotation = mySpline.rotation --igualamos la rotación con la spline
    		print (each.name + ": " + each.rotation as string ) --dejamos un log para comprobar posteriormente
    	)
    )
    El log retorna que cambió la orientacion de todos los controles como es de esperar:
    Código:
    "Point01: (quat 0 0 0.382683 0.92388)"
    "Point02: (quat 0 0 0.382683 0.92388)"
    "Point03: (quat 0 0 0.382683 0.92388)"
    Pero el resultado difiere, sólo cambió la orientacion del primero, de alguna forma no fue capaz de retener el cambio en el resto de los nodos del array:

    De hecho si hago la rotación con autokey en el frame 1 queda animado y en el cuadro 1 todos tienen la orientacion como corresponde, es como si el loop no fuera capaz de retener los valores o los sobreescribiera de alguna forma.

    Alguien sabe cual es el problema? que estoy haciendo mal?

    Gracias

    PD: Si haciera el loop usando un índice para recorrer el array (como en el código de abajo) el resultado es exactamente el mismo
    Código:
    for i=1 to splineMod.helper_List.count do
    (
    	splineMod.helper_List[i].rotation = mySpline.rotation --igualamos la rotación con la spline
    	print (splineMod.helper_List[i].name + ": " + splineMod.helper_List[i].rotation as string ) --dejamos un log para comprobar posteriormente
    )
    Miniaturas adjuntadas Miniaturas adjuntadas [MaxScript] Loop no retiene los cambios   -csaez_dontwork.jpg  

  2. #2
    Senior Member Avatar de iherrero20
    Fecha de ingreso
    Oct 2008
    Ubicación
    Toledo (España)
    Mensajes
    3,078

    Re: [MaxScript] Loop no retiene los cambios?

    No sé a que te refieres, los nodos están todos rotados, cada uno esta en diferente posición, si quieres que estén todos en la misma posición tendrás que igualar los otros nodos al primero.
    Si recorres todos los nodos todos cambiaran, si quieres que todos estén afectados por el primero sin cambiar debes igualar la matriz al primer elemento.
    Última edición por iherrero20; 10-01-2009 a las 00:05
    Si vives mirando hacia el sol, no verás las sombras. (Helen Séller)

  3. #3
    pythonized... Avatar de Cesar Saez
    Fecha de ingreso
    Mar 2004
    Ubicación
    Granada, España
    Mensajes
    3,765

    Re: [MaxScript] Loop no retiene los cambios?

    Cita Iniciado por iherrero20 Ver mensaje
    No sé a que te refieres, los nodos están todos rotados, cada uno esta en diferente posición, si quieres que estén todos en la misma posición tendrás que igualar los otros nodos al primero.
    Si recorres todos los nodos todos cambiaran, si quieres que todos estén afectados por el primero sin cambiar debes igualar la matriz al primer elemento.
    El bucle intenta igualar la rotación de cada nodo a la spline (cuya rotación se mantiene contante). El log indica que efectivamente se realizó la rotación a cada nodo pero de alguna forma no se refleja en la interface.

    Siguiendo tu sugerencia (cambiando el loop por algo como lo de abajo) sucede exactamente lo mismo.
    Código:
    splineMod.helper_List[1].rotation = mySpline.rotation
    for i=2 to splineMod.helper_List.count do
    (
    	splineMod.helper_List[i].rotation = splineMod.helper_List[1].rotation --igualamos la rotación con la spline
    	print (splineMod.helper_List[i].name + ": " + splineMod.helper_List[i].rotation as string ) --dejamos un log para comprobar posteriormente
    )
    Gracias de todas formas

  4. #4
    Relojero 3D Avatar de kiko_L
    Fecha de ingreso
    Dec 2005
    Ubicación
    Pamplona
    Mensajes
    1,819

    Re: [MaxScript] Loop no retiene los cambios?

    Joder Cesar, llevo un buen rato mirando el código y no hay manera de encontrar el fallo. Me tiene muy mosca...Le seguiré dando vueltas a ver si descubro algo y si encuentras el fallo comentanos. Un saludo
    Última edición por kiko_L; 10-01-2009 a las 02:23

  5. #5
    Senior Member Avatar de phoelix
    Fecha de ingreso
    May 2005
    Ubicación
    Bogotá, Colombia
    Mensajes
    321

    Re: [MaxScript] Loop no retiene los cambios?

    Hola Cesar :D,

    hay un detalle cuando defines la propiedad .rotation de un nodo, y es que esta asignacion 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 si mismo tendrías que hacerlo de esta forma:

    Código:
    in coordsys each each.rotation = mySpline.rotation
    pero en esto no se encuentra el problema que mencionas sobre las rotaciones sobreescritas, 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 parentesis el visor no se actualizara hasta que se ejecute todo lo que esta allí dentro, por lo tanto todas las transformaciónes que realices serán sobrescritas al final, extrañemente a escepcion 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 parentesis 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 redrawViews() 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. :D

    Código:
    fn createSpline posPoints = --retorna una spline usando las coordenadas del array posPoint
    (
    	local ss = SplineShape pos:(posPoints[1])
    	addNewSpline ss
    	for each in posPoints do
    	(
    		addKnot ss 1 #smooth #curve each
    	)
    	updateShape ss
    	return ss
    )
    (
    	local mySpline = createSpline #([0,0,0], [50,0,0], [100,0,0]) --creo una spline
    	mySpline.rotation.z_rotation = 45
    	
    	addModifier mySpline (spline_IK_control()) --agregamos un modificador splineIK control
    	local splineMod = mySpline.Modifiers[1]
    	splineMod.linkTypes = 2 --los helpers no van linkeados entre si
    	splineMod.createHelper (numKnots mySpline) --creamos los helpers que controlanran la curva
    	
    	redrawViews()
    
    	--ATENCION:
    	--SUPONGAMOS QUE QUIERO IGUALAR LA ORIENTACION DE LOS
    	--CONTROLES CREADOS MEDIANTE EL MODIFICADOR CON LA SPLINE
    	
    	for each in splineMod.helper_List do
    	(
    		in coordsys 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
    	)
    )
    método de creación manual de helpers:
    Código:
    fn createSpline posPoints = --retorna una spline usando las coordenadas del array posPoint
    (
    	local ss = SplineShape pos:(posPoints[1])
    	addNewSpline ss
    	for each in posPoints do
    	(
    		addKnot ss 1 #smooth #curve each
    	)
    	updateShape ss
    	return ss
    )
    (
    	mySpline = createSpline #([10,0,0], [50,0,0], [100,0,0]) --creo una spline
    	mySpline.rotation.z_rotation = 45
    
    	addModifier mySpline (spline_IK_control()) --agregamos un modificador splineIK control
    	splineMod = mySpline.Modifiers[1]
    
    	--se crean los helpers y se alinean con los vértices
    	helperArray=#()
    	for i=1 to (numknots myspline) do
    	(
    		append helperArray (point pos:(getknotpoint mySpline 1 i))
    	)
    	--se agregan los vértices al spline ik control
    	splineMod.helper_List=helperArray
    	
    	--se alinean las rotationes
    	for each in splineMod.helper_List do
    	(
    		in coordsys each each.rotation=myspline.rotation
    	)
    )
    Última edición por phoelix; 10-01-2009 a las 03:29
    Nuestro corto basado en Matrix - TRICKSTER - wip:
    thetricksterproject.blogspot.com

    website personal:
    www.joleanes.com

  6. #6
    Senior Member Avatar de Ruramuq
    Fecha de ingreso
    Sep 2004
    Mensajes
    124

    Re: [MaxScript] Loop no retiene los cambios?

    uau, muy astuto, había intentado con redrawViews, pero no entendía bien por qué.. así que no respondi.
    Porque hará max esas cosas cuando uno podría usar 'with redraw off'..

  7. #7
    pythonized... Avatar de Cesar Saez
    Fecha de ingreso
    Mar 2004
    Ubicación
    Granada, España
    Mensajes
    3,765

    Re: [MaxScript] Loop no retiene los cambios?

    wow! gracias phoelix, a esta altura eres mi guru personal, siempre me terminas resolviendo la papeleta. Muchísimas gracias, por esta y por las anteriores

  8. #8
    pythonized... Avatar de Cesar Saez
    Fecha de ingreso
    Mar 2004
    Ubicación
    Granada, España
    Mensajes
    3,765

    Re: [MaxScript] Loop no retiene los cambios?

    y •Ruramuq• también, que conste!

    Gracias a todos por ayudarme (o tener la intención, que es lo que cuenta) con mis dudas

  9. #9
    Senior Member Avatar de phoelix
    Fecha de ingreso
    May 2005
    Ubicación
    Bogotá, Colombia
    Mensajes
    321

    Re: [MaxScript] Loop no retiene los cambios?

    vale Cesar, que bueno que te halla sido de utilidad
    Nuestro corto basado en Matrix - TRICKSTER - wip:
    thetricksterproject.blogspot.com

    website personal:
    www.joleanes.com

Temas similares

  1. Blender cambios timeline
    Por rulflink en el foro Programación y Scripts
    Respuestas: 2
    Último mensaje: 10-02-2013, 19:58
  2. Cambios en la pagina
    Por slash en el foro Todo menos Infografía
    Respuestas: 2
    Último mensaje: 14-10-2004, 00:13

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •