Max overkjører tangenter satt i maxScript

Max scripts

Moderatorer: Super Moderatorer, Admins


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Max overkjører tangenter satt i maxScript

Legg innav hardrock_ram » søn 12 feb, 2012

Jeg skriver et script for å kunne reptere animasjonsykluser (walk cycles ol.) på en enkel måte. Jeg henter ut in\out - tangenter fra nåværende keys, putter dem i et array, og tar dem tilbake på de nye keysene som er satt ut. Jeg er 99% sikker på at dette fungerte akkurat som det skulle tidligere i dag, men nå er den helt vrang! Problemet er at Max overkjører tangenter jeg setter i scriptet med det som står som default in\out tangents i interfacet nederst i høyre hjørne.
Jeg har printet ut arrayene med tangenter underveis i scriptet og jeg har prøvd å sette tangenter i listener. Begge deler ser helt fint ut. Men selve scriptet mitt blir altså overkjørt. :x
Jeg skal innrømme at jeg begynner å bli trøtt, og når dette problemet plutselig dukket opp kl 2 på natta, så forandret ikke akkurat humøret mitt seg til et konstruktivt problemfiksemodus, for å si det mildt :P
Jeg har vel sikkert forandret noe i koden mens jeg har gjort noe annet, også ser jeg ikke hva som går feil nå. Gidder noen å se på koden, eller ihvertfall prøve den og se om dere får samme problem? :)
Man må ha et objekt med animasjon på vanlig position_XYZ eller euler_XYZ - kontroller. Om det er list_controller øverst spiller ingen rolle

EDIT: Ser nå at så lenge repeats står til 1 (default), og heller sette "to frame" høyt og trykke execute flere ganger, så går det bra, men forstår ikke hvorfor :?

Kode: Velg alt

Rollout cycleRepeater "Cycle Repeater"
(   
   --Interface
   pickButton pBtn_addParentObject "Add parent type object"
   pickButton pBtn_removeParentObject "Remove parent type object"
   pickButton pBtn_addChildObject "Add child type object"
   pickButton pBtn_removeChildObject "Remove child type object"
   button btn_empty "Remove all stored objects"
   spinner spn_cycleStart "Cycle start frame" type:#integer range: [-9999,9999,currentTime]
   spinner spn_cycleEnd "Cycle end frame" type:#integer range: [-9999,9999,currentTime]
   spinner spn_repeats "Repeats" type:#integer range:[1,9999,1]
   button btn_printParents "Print parent objects"
   button btn_printChild "Print child objects"
   button btn_execute "Execute"
   
   --Variabler
   local parentObjects =#() -- For å ta vare på objekter som hele tiden plusser på verdiene for hver syklus
   local childObjects =#() -- For å ta vare på objekter som hele tiden veksler mellom de samme verdiene for hver syklus
   
   --Hendelser
   on pBtn_addParentObject picked obj do -- Hva skjer når man trykker på knappen for å legge til et parent type object
   (
      appendIfUnique parentObjects obj
   )
   
   on pBtn_removeParentObject picked obj do -- Hva skjer når man trykker på knappen for å fjerne et parent type object
   (
      indexnr = findItem parentObjects obj
      if indexnr >0 do deleteItem parentObjects indexnr
   )
   
   on pBtn_addChildObject picked obj do -- Hva skjer når man trykker på knappen for å legge til et child type object
   (
      appendIfUnique childObjects obj
   )
   
   on pBtn_removeChildObject picked obj do -- Hva skjer når man trykker på knappen for å fjerne et child type object
   (
      indexnr = findItem childObjects obj
      if indexnr >0 do deleteItem childObjects indexnr
   )
   
   on btn_empty pressed do -- Hva skjer når man trykker på knappen for å fjerne alle objekter i lista
   (
      free parentObjects
      free childObjects
   )
   
   on btn_printParents pressed do -- Hva skjer når man trykker knappen for å printe alle parents
   (
      for i = parentObjects do print i.name
   )
   
   on btn_printChild pressed do -- Hva skjer når man trykker knappen for å printe alle children
   (
      for i = childObjects do print i.name
   )
   
   on btn_execute pressed do -- Hva skjer når man trykker knappen for å kjøre scriptet
   (
      
      fn masterFunction currentObj currentAxis subControllerCount posOrRot = --Hovedfunksjonen for å hente ut keys og verdier, forskyve dem, og legge dem tilbake
      (
         --Liste med variabler
         local fromTime = spn_cycleStart.value as integer --Forenkler språket for å indikere oppstartstid
         local toTime = spn_cycleEnd.value as integer --Forenkler språket for å indikere stopptid
         local runningTime = (spn_cycleEnd.value) - (spn_cycleStart.value) -- Forenkler språket ved å indikere oppstartstid og tidsvinduet for scriptet
         local frameWithKeyArray = #() -- Alle Frames som har en tilhørende key
         local valueArray = #() --Tilhørende verdier til frames
         
         local inTangentTypeArray = #()
         local outTangentTypeArray = #()
         
         local inTangentArray = #()
         local outTangentArray =#()
         
         local inTangentLengthArray = #()
         local outTangentLengthArray =#()
         
         
         local currentController --variabel som skal inneholde kontrolleren
         local runs --variabel som indikerer hvor mange kontrollere det må sjekkes for keys
         
         if subControllerCount == 0 do runs = 1 --null på subControllerCount indikerer at det ikke er noen list_controller
         if subControllerCount >0 do runs = subControllerCount -- indikerer at det ER en list_controller i subControllerCount
            
         
         for currentControllerIndex = 1 to runs do -- Det kjøres en loop over alle position controllere
         (
            
            --Gir currentController korrekt oppsett
            if classOf currentObj.controller != Link_Constraint and subControllerCount == 0 and posOrRot == "pos" do currentController = currentObj.controller.position.controller[currentAxis].controller
            if classOf currentObj.controller != Link_Constraint and subControllerCount != 0 and posOrRot == "pos" do currentController = currentObj.controller.position.controller[currentControllerIndex][currentAxis].controller
            if classOf currentObj.controller == Link_Constraint and subControllerCount == 0 and posOrRot == "pos" do currentController = currentObj.controller.link_params.position.controller[currentAxis].controller
               
            if classOf currentObj.controller != Link_Constraint and subControllerCount == 0 and posOrRot == "rot" do currentController = currentObj.controller.rotation.controller[currentAxis].controller
            if classOf currentObj.controller != Link_Constraint and subControllerCount != 0 and posOrRot == "rot" do currentController = currentObj.controller.rotation.controller[currentControllerIndex][currentAxis].controller
            if classOf currentObj.controller == Link_Constraint and subControllerCount == 0 and posOrRot == "rot" do currentController = currentObj.controller.link_params.rotation.controller[currentAxis].controller
               
            if currentController.keyable == true and currentController.keys.count >0 do -- sjekker at det er keys på kontrolleren
            (
               --Arrays med keys og verdier fylles
               for keyNumber = 1 to numKeys currentController do
               (
                  frameWithKey = ((((getKeyTime currentController keyNumber as float) / 4800) * frameRate) as integer)
                  if frameWithKey >= fromTime and frameWithKey <= toTime then
                  (
                     --Frames med keys puttes i array
                     append frameWithKeyArray frameWithKey
                     
                     --Den tilhørende verdien for kontrolleren puttes i array
                     append valueArray (currentController.keys[keyNumber].value)
                     
                     --Tangentene puttes i et array
                     tangentObj = currentController.keys[keyNumber] --gjeldende objekt og key:
                     
                     append inTangentTypeArray tangentObj.inTangentType
                     append outTangentTypeArray tangentObj.outTangentType
                     append inTangentArray tangentObj.inTangent
                     append outTangentArray tangentObj.outTangent
                     append inTangentLengthArray tangentObj.inTangentLength
                     append outTangentLengthArray tangentObj.outTangentLength
                  )
               )
               
               for repeats = 1 to spn_repeats.value do
               /*
               Repetisjonen kan enkelt kjøres flere ganger fordi koden i dette scopet forskyver keys og verdier i arrayet der de er langret,
               altså blir ORIGINALverdiene forandret. Tangenter skal ikke forskyves, kun repeteres
               */
               (
                  --Forskyvelse av keys:
                  
                  local lastKeyInArray = frameWithKeyArray.count
                  local frameDifference = frameWithKeyArray[lastKeyInArray] - frameWithKeyArray[1]
                  
                  for i = 1 to lastKeyInArray do
                  (
                     frameWithKeyArray[i] = frameWithKeyArray[i] + frameDifference
                  )
                  
                  --Forskyvelse av kontrollerverdier:
                  local numberOfValues = valueArray.count --Variabel som inneholder max indexnr i arrayet valueArray
                  valueAdd = valueArray[numberOfValues] - valueArray[1] -- verdi som skal legges til på alle keys
                  for i = 1 to numberOfValues do
                  (
                     valueArray[i] += valueAdd --verdiene legges til
                  )
                  
                  --nye keyframes legges tilbake på kontrolleren
                  for i = 1 to lastKeyInArray do
                  (
                     addNewKey currentController frameWithKeyArray[i]
                     
                     -- verdier for keys legges på
                     with animate on
                     (
                        at time frameWithKeyArray[i] currentController.value = valueArray[i]
                     )
                     
                     --Keys får riktige tangenter
                     tangentObj = currentController.keys[(lastKeyInArray + i - 1)] --gjeldende objekt og key:
                     
                     tangentObj.inTangentType = inTangentTypeArray[i]
                     tangentObj.outTangentType = outTangentTypeArray[i]
                     
                     --Retning skal kun redigeres hvis tangenten er #custom (spline i interfacet)
                     if tangentObj.inTangentType == #custom do
                     (
                        tangentObj.inTangent = inTangentArray[i]
                        tangentObj.inTangentLength =  inTangentLengthArray[i]
                     )
                     
                     --Lengde skal kun redigeres hvis tangenten er #custom (spline i interfacet)
                     if tangentObj.outTangentType == #custom do
                     (
                        tangentObj.outTangent = outTangentArray[i]
                        tangentObj.outTangentLength = outTangentLengthArray[i]
                     )
                  )
               )--Slutt på repeats
            )
            
            
            --Arrays tømmes for å klargjøres til neste kontroller
            free frameWithKeyArray
            free valueArray
            
            free inTangentTypeArray
            free outTangentTypeArray
            free inTangentArray
            free outTangentArray
            free inTangentLengthArray
            free outTangentLengthArray
         )
      ) -- slutt på masterFunction
      
      
      for obj = parentObjects do --Loop som kjøres på alle objekter i parentObjects - arrayet
      (
         local subControllerCount = 0 --Defaultverdi. Indikerer at det IKKE er noen list_controller. 1 eller flere indikerer list_controller og antall sub-controllere
         
         try (if classOf obj.controller.position.controller == position_list do subControllerCount = obj.controller.position.controller.count) catch ()
         --Forandrer subControllerCounts verdi for å indikere at det er list_controller, og antall sub-controllere
         
         for axis = 1 to 3 do -- Loop som kjører gjennom XYZ-aksene
         (
            masterFunction obj axis subControllerCount "pos" -- Funksjonen kjøres
         )
      )
      
      for obj = parentObjects do --Loop som kjøres på alle objekter i parentObjects - arrayet
      (
         local subControllerCount = 0 --Defaultverdi. Indikerer at det IKKE er noen list_controller. 1 eller flere indikerer list_controller og antall sub-controllere
         
         try (if classOf obj.controller.rotation.controller == rotation_list do subControllerCount = obj.controller.rotation.controller.count) catch ()
         --Forandrer subControllerCounts verdi for å indikere at det er list_controller, og antall sub-controllere
         
         for axis = 1 to 3 do -- Loop som kjører gjennom XYZ-aksene
         (
            masterFunction obj axis subControllerCount "rot" -- Funksjonen kjøres
         )
      )
      
      
      for currentObj = childObjects do
      (
         
      )
   )
) createDialog cycleRepeater 200 300
if your not living on a killing ground, you better make your own


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 12 feb, 2012

edit: ble ikke riktig allikevel :P
if your not living on a killing ground, you better make your own


Gå tilbake til «Max scripts»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 1 gjest

cron