Huesos elásticos - script corregido

Moderadores: David, Tutores

Responder
ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

Huesos elásticos - script corregido

Mensaje por ikerJ »

Buenas,

A raíz de un aviso de Juan, me he dado cuenta de que el script sólo funciona bien cuando tenemos más de dos puntos seleccionados. Ésta es la versión que funciona también cuando la selección consiste únicamente en dos puntos:

Código: Seleccionar todo

--select two points or more points and run the code below for creating a 'stretchy' bone or a 'stretchy' chain

fn makeNubBone lastBone =
(   
   local pos = lastBone.transform[4] -- get the position of the last bone. 
   local xDir = lastBone.transform[1] -- get the vector of the X point.
  
   local startPoint = pos + xDir * lastBone.length 
   local endPoint = startPoint + xDir * lastBone.width
  
   local nubBone = boneSys.createBone startPoint endPoint lastBone.transform[3] -- create the bone.
  
   nubBone.width = lastBone.width
   nubBone.height = lastBone.height
   nubBone.wireColor = lastBone.wireColor
  
   nubBone.parent = lastBone
   nubBone.name = lastBone.name + "_Nub"
  
   return nubBone
)

fn createElasticBones pointList = 
(
   if selection.count == 2 do
   (
      if classof pointList[1] == Point and classof pointList[2] == Point then
      (
         oBone = boneSys.createBone pointList[1].pos pointList[2].pos pointList[1].transform[3]
         theNub = makeNubBone oBone

         oBone.position.controller = Position_Constraint()
         oBone.position.controller.appendTarget pointList[1] 100

         theNub.position.controller = Position_Constraint()
         theNub.position.controller.appendTarget pointList[2] 100

         oBone.rotation.controller = LookAt_Constraint()
         oBone.rotation.controller.appendTarget pointList[2] 100
         oBone.rotation.controller.viewline_length_abs = false
         oBone.rotation.controller.upnode_world = false
         oBone.rotation.controller.pickUpnode = pointList[1]
         oBone.rotation.controller.upnodeAxis = 2
         oBone.rotation.controller.stoUpAxis = 2
      )
      else messageBox "Selected objects must be points"   
   )

   if selection.count > 2 do
   (     
      theBones = #()
      for i = 1 to (selection.count-1) do
      (
        theBone = boneSys.createBone pointList[i].pos pointList[i+1].pos pointList[i].transform[3]
        append theBones theBone      
      )
      
      theNub = makeNubBone theBones[theBones.count]
      append theBones  theNub
      theNub.position.controller = Position_Constraint()
      theNub.position.controller.appendTarget pointList[pointList.count] 100

      for i = 1 to theBones.count-1 do
      (   
        theBones[i].position.controller = Position_Constraint()
        theBones[i].position.controller.appendTarget pointList[i] 100            
        theBones[i].rotation.controller = LookAt_Constraint()
        theBones[i].rotation.controller.appendTarget pointList[i+1] 100
        theBones[i].rotation.controller.viewline_length_abs = false
        theBones[i].rotation.controller.upnode_world = false
        theBones[i].rotation.controller.pickUpnode = pointList[i]
        theBones[i].rotation.controller.upnodeAxis = 2
        theBones[i].rotation.controller.stoUpAxis = 2               
      )
      
      for i = 2 to theBones.count do
      (
        theBones[i].parent = theBones[i-1]
      )      
   )
)

createElasticBones selection


El problema era una variable mal escrita ^_^

¡Saludos!

miguelbr
Iniciado
Iniciado
Mensajes: 24
Registrado: Mar Oct 04, 2011 8:37 pm

Re: Huesos elásticos - script corregido

Mensaje por miguelbr »

Pues muchisimas gracias Iker y Juan, porque llevaba unos dias volviéndome loco !!!!

miguelbr
Iniciado
Iniciado
Mensajes: 24
Registrado: Mar Oct 04, 2011 8:37 pm

Re: Huesos elásticos - script corregido

Mensaje por miguelbr »

Hola Iker

Estaba yo echándole un vistazo "con zoom" a este script que te has marcao, y me han surgido algunas dudillas:

en la función createElasticBones, en el segundo if (selection.count > 2), pones esta líneas que me parecen importantes porque si no voy mal, es donde decides la gestión del hueso Nub en la cadena:

theNub = makeNubBone theBones[theBones.count]
append theBones theNub
theNub.position.controller = Position_Constraint()
theNub.position.controller.appendTarget pointList[pointList.count] 100


En la 1ª y 4ª línea que quieres decir cuando utilizas [theBones.count], y [pointList.count] ? estás llamando a todos los elementos de la lista ? igual soy un poco burro pero porqué para crear el Nub, parece que llamas a toda la lista?


Y luego otra cosilla más: cuando yo voy metiendo elementos en una lista por medio de un bucle, tengo más o menos claro el orden en que estará cada elemento dentro de la lista, pero cuando no, cómo puedo yo controlar el orden que tendrá cada elemento dentro de la lista?

Graciassss

Responder

Volver a “Rig de Personajes”