Script for å legge til kameraristing

Max scripts

Moderatorer: Super Moderatorer, Admins


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

Script for å legge til kameraristing

Legg innav hardrock_ram » fre 22 feb, 2013

Skrev et kjapt skript bare for gøy. Jeg har en del kameraer i en scene som skal ha subtile variasjoner i bevegelsene for å unngå cg-looken på kameraanimasjon. Tenkte jeg like gjerne kunne skrive et script for det, framfor å gjøre det manuelt :P.
Scriptet kan kun kjøres på kameraer med default animasjonskontrollere. Begrensningene er lagt inn for å slippe å bruke så voldsomt mye tid på å skrive.

1. Man velger kamera og trykker på use selected camera

2. man huker av for hvilke animasjonskontrollere man vil legge variasjoner på. Merk at det må være minimum to keys på kontrolleren, ellers vil det ikke legges inn nye keys i det hele tatt.

3. Intensity er hvor store variasjoner det skal være, mens frequency er hvor ofte det skal legges inn keys. Det brukes random verdier mellom de to tallene som er valgt. Keys som eksisterer fra før vil IKKE forandres på.

4. Undo fjerner keys man har lagt til så lenge den aktuelle instancen av programmet er åpen

[spoiler]

Kode: Velg alt

--START rollout_MainScreen
   Rollout rollout_MainScreen "Camera Shake"
   (
      Button Btn_selectCamera "Use selected camera"
      
      group "Select transform axis"
      (
         checkbox chkBox_TransformX "Transform X-axis"
         checkbox chkBox_TransformY "Transform Y-axis"
         checkbox chkBox_TransformZ "Transform Z-axis"
      )
      
      group "Select rotation axis"
      (
         checkbox chkBox_RotationX "Rotation X-axis"
         checkbox chkBox_RotationY "Rotation Y-axis"
         checkbox chkBox_RotationZ "Rotation Z-axis"
      )
      
      group "Select intensity and frequency"
      (
         spinner spn_intensity_high "Highest intensity" type:#float range: [-9999,9999,0]
         spinner spn_intensity_low "Lowest intensity" type:#float range: [-9999,9999,0]
         
         spinner spn_frequency_high "Lowest frequency" type:#integer range: [1,9999,10]
         spinner spn_frequency_low "Highest frequency" type:#integer range: [1,9999,1]
         --OBS: Merk at lowest og highest frequency er byttet på teksten til knappen. I selve scriptet er frequency high det lengste mellomrommet mellom to keyframes
      )
      
      Button btn_execute "Execute"
      Button btn_undo "Undo"
      --SLUTT interface
      
      
      on Btn_selectCamera pressed do
      (
         --Fjerner først gammelt kamera
         selectedCamera = undefined
         
         --START sjekk at det er et kamera, at kontrollere er Position_XYZ og Euler_XYZ, og at alle subkontrollere er bezier_float
         if selection.count != 1 or superClassOf $ != camera then messagebox "Select only one camera"
         else
         (
            if classof $.controller.position.controller != Position_XYZ \
            or classof $.controller.rotation.controller != Euler_XYZ
            then messageBox "The camera does not have default animation controllers"
            else
            (
               fn fnAnimationControllerCheck animationController =
               (
                  if classof animationController != bezier_float then 0 else 1
               )
               
               local counter = 0
               counter += fnAnimationControllerCheck $.controller.position.controller.X_position.controller
               counter += fnAnimationControllerCheck $.controller.position.controller.Y_position.controller
               counter += fnAnimationControllerCheck $.controller.position.controller.Z_position.controller
               
               counter += fnAnimationControllerCheck $.controller.rotation.controller.X_rotation.controller
               counter += fnAnimationControllerCheck $.controller.rotation.controller.Y_rotation.controller
               counter += fnAnimationControllerCheck $.controller.rotation.controller.Z_rotation.controller
               
               if counter != 6 then messagebox "Not all animation subcontrollers are bezier float"
               else selectedCamera = $
            )
         )
         --SLUTT sjekk at det er et kamera, at kontrollere er Position_XYZ og Euler_XYZ, og at alle subkontrollere er bezier_float
      ) --SLUTT on Btn_selectCamera pressed do
      
      
      on btn_execute pressed do
      (
         --START execute
         
         --START funksjon som kjøres på kontrolleren
         fn fnAddShake animationController intensity_high intensity_low frequency_high frequency_low controllerType =
         (
            local firstKey = 1
            local lastKey = animationController.keys.count
            
            --Frames med originale keys legges i arrayet "originalKeyFrames"
            local originalKeyFramesArray = #()
            for i = firstKey to lastKey do append originalKeyFramesArray ((((getKeyTime animationController i as float) /4800) * frameRate) as integer)
            
            --START legg til keys
            for currentKey = firstKey to (lastKey-1) do
            (
               local startFrameSegment = originalKeyFramesArray[currentKey]
               local endFrameSegment = originalKeyFramesArray[currentKey + 1]
               
               local baseKeyFrame = startFrameSegment
               local newKeyFrame = baseKeyFrame+(random frequency_low frequency_high)
               if newKeyFrame + frequency_low >= endFrameSegment do newKeyFrame = undefined
               
               while newKeyFrame != undefined do
               (
                  addNewKey animationController newKeyFrame
                  baseKeyFrame = newKeyFrame
                  newKeyFrame = baseKeyFrame+(random frequency_low frequency_high)
                  if newKeyFrame + frequency_low >= endFrameSegment do newKeyFrame = undefined
               )
            )
            --SLUTT legg til keys
            
            
            --START forandre verdier på nye keys
            
            --Keys telles på nytt etter at nye er lagt til, og lastKey telles på nytt
            lastKey = animationController.keys.count
            
            for currentKey = firstKey to lastKey do
            (
               --Keyframe det jobbes på får sitt frame-nummer lagt inn i currentKeyFrame
               currentKeyFrame = (((getKeyTime animationController currentKey as float) /4800) * frameRate) as integer
               
               if (findItem originalKeyFramesArray currentKeyFrame) == 0 then --Hvis keyframen IKKE er original, så forandres dens value
               (
                  with animate on
                  (
                     at time currentKeyFrame animationController.value = (animationController.value) + (random intensity_low intensity_high)
                  )
               )
               else
               (
                  --currentKeyFrame legges inn i arrays. Arrayene ligger nesten på toppnivå, og brukes til knappen "undo". Disse inneholder ORIGINALE keyframes
                  if controllerType == "Xpos" do append originalKeyFramesXpos currentKeyFrame
                  if controllerType == "Ypos" do append originalKeyFramesYpos currentKeyFrame
                  if controllerType == "Zpos" do append originalKeyFramesZpos currentKeyFrame
                     
                  if controllerType == "Xrot" do append originalKeyFramesXrot currentKeyFrame
                  if controllerType == "Yrot" do append originalKeyFramesYrot currentKeyFrame
                  if controllerType == "Zrot" do append originalKeyFramesZrot currentKeyFrame
               )
            )
            --SLUTT forandre verdier på nye keys
         )
         --SLUTT funksjon som kjøres på kontrolleren
         
         
         
         
         --START kjør funksjon
         if chkBox_TransformX.checked == true do
         (
            fnAddShake selectedCamera.controller.position.controller.X_position.controller \
            spn_intensity_high.value spn_intensity_low.value spn_frequency_high.value spn_frequency_low.value "Xpos"
         )
         
         if chkBox_TransformY.checked == true do
         (
            fnAddShake selectedCamera.controller.position.controller.Y_position.controller \
            spn_intensity_high.value spn_intensity_low.value spn_frequency_high.value spn_frequency_low.value "Ypos"
         )
         
         if chkBox_TransformZ.checked == true do
         (
            fnAddShake selectedCamera.controller.position.controller.Z_position.controller \
            spn_intensity_high.value spn_intensity_low.value spn_frequency_high.value spn_frequency_low.value "Zpos"
         )
         
         if chkBox_RotationX.checked == true do
         (
            fnAddShake selectedCamera.controller.rotation.controller.X_rotation.controller \
            spn_intensity_high.value spn_intensity_low.value spn_frequency_high.value spn_frequency_low.value "Xrot"
         )
         
         if chkBox_RotationY.checked == true do
         (
            fnAddShake selectedCamera.controller.rotation.controller.Y_rotation.controller \
            spn_intensity_high.value spn_intensity_low.value spn_frequency_high.value spn_frequency_low.value "Yrot"
         )
         
         if chkBox_RotationZ.checked == true do
         (
            fnAddShake selectedCamera.controller.rotation.controller.Z_rotation.controller \
            spn_intensity_high.value spn_intensity_low.value spn_frequency_high.value spn_frequency_low.value "Zrot"
         )
         --SLUTT kjør funksjon
         
         --SLUTT execute
      )
      
      
      on btn_undo pressed do
      (--START btn_undo
         
         --Funksjon som sletter uorginale keyframes
         fn fnDeleteNewKeys animationController currentFramesArray =
         (
            for currentKey = animationController.keys.count to 1 by -1 do
            (
               if findItem currentFramesArray ((((getKeyTime animationController currentKey as float) /4800) * frameRate) as integer) == 0 do
               (
                  deleteKey animationController currentKey
               )
            )
         )
         
         
         if chkBox_TransformX.checked == true do fnDeleteNewKeys selectedCamera.controller.position.controller.X_position.controller originalKeyFramesXpos
         if chkBox_TransformY.checked == true do fnDeleteNewKeys selectedCamera.controller.position.controller.Y_position.controller originalKeyFramesYpos
         if chkBox_TransformZ.checked == true do fnDeleteNewKeys selectedCamera.controller.position.controller.Z_position.controller originalKeyFramesZpos
            
         if chkBox_RotationX.checked == true do fnDeleteNewKeys selectedCamera.controller.rotation.controller.X_rotation.controller originalKeyFramesXrot
         if chkBox_RotationY.checked == true do fnDeleteNewKeys selectedCamera.controller.rotation.controller.Y_rotation.controller originalKeyFramesYrot
         if chkBox_RotationZ.checked == true do fnDeleteNewKeys selectedCamera.controller.rotation.controller.Z_rotation.controller originalKeyFramesZrot

      )--SLUTT btn_undo
      
      
      
      
      
      
   )--SLUTT rollout_MainScreen
   
   
createDialog rollout_MainScreen 200 400   
)--SLUTT script

[/spoiler]
Sist redigert av hardrock_ram den søn 24 feb, 2013, redigert 4 ganger totalt.
if your not living on a killing ground, you better make your own

Brukeravatar

tassel
Innlegg: 3987
Registrert: man 26 sep, 2005
Sted: Oslo
Kontakt:

Legg innav tassel » fre 22 feb, 2013

Nice. :)

Virker bare på Free Camera eller?


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

Legg innav hardrock_ram » fre 22 feb, 2013

Takk :)
Ja, det er lagt inn en del harde begrensninger for å slippe å bruke så mye tid på å skrive. Det er ment kun for bruk i en spesiell scene, og jeg må prøve å fokusere på den, ikke scriptet :P
if your not living on a killing ground, you better make your own

Brukeravatar

tassel
Innlegg: 3987
Registrert: man 26 sep, 2005
Sted: Oslo
Kontakt:

Legg innav tassel » fre 22 feb, 2013

hardrock_ram skrev:Takk :)
Ja, det er lagt inn en del harde begrensninger for å slippe å bruke så mye tid på å skrive. Det er ment kun for bruk i en spesiell scene, og jeg må prøve å fokusere på den, ikke scriptet :P


Ikke noe pes :wink:


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

Legg innav hardrock_ram » fre 22 feb, 2013

Det er lite arbeid å legge inn risting for target camera da, så bare si ifra :).
Grunnen til at jeg ikke gjorde det, er fordi jeg ikke bruker target camera. Blir mer naturlig kamerabruk med free camera mener jeg :). En eller annen her på forumet lagde jo også en kamerarigg (som i virkeligheten) for å få enda mer natrulige bevegelser ...
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