Catenary-kurve

Moderatorer: dboydesign, Super Moderatorer, Admins

Brukeravatar

Trådstarter
larsem8
Innlegg: 1506
Registrert: ons 09 nov, 2005
Sted: Kristiansand

Catenary-kurve

Legg innav larsem8 » ons 07 mai, 2014

Jeg prøver å lage en rigg for tau/kabel.

Selve tauet/kabelen tenker jeg å bare bruke en spline med 3 vertexer, hvor den midtre har smooth interpolering, og hvor hver vertex er linket til en point helper.

Jeg vil kunne definere lengden på tauet i en custom parameter og flytte de to endepunktene.
Så det jeg trenger er en expression/script-kontroller som styrer midtpunktet både i horisontal og vertikal akse basert på lengden og posisjonene til endepunktene, slik at jeg får noe som iallfall er tilnærmet en catanary-kurve..

Noen ideer?
Alle gode ting er 3D

Brukeravatar

Trådstarter
larsem8
Innlegg: 1506
Registrert: ons 09 nov, 2005
Sted: Kristiansand

Legg innav larsem8 » tor 08 mai, 2014

Jeg har to point helpere P1 og P2 og en custom attribute kalt A.

P2 er linket til P1

P2 har en expression controller på Z-aksen med to scalar variabler; X og A.
X er assignet til P1's X-akse og A er assignet til custom attributen A.

Funksjonen i controlleren er følgende:

Kode: Velg alt

A*cosh(X/A)


(cosh er en definert funksjon i expression-controlleren og er den hyperbolske cosinus-funksjonen som tilsvarer (e^x+e^-x)/2 )

Resultatet er at når vi flytter P1 i x-aksen så "tegner" P2 en catenary-kurve.
Se bildet hvor jeg har animert P1 i x-aksen og skrudd på trajectories.

Attributen A kontrollerer på en måte lengden på kurven, men "invers", dvs at 0 går mot uendelig, og tallet gir ikke noe mening i forhold til fysisk lengde som jeg ønsker.

Det eneste man har kontroll på her er den horisontale avstanden mellom endepunktene (ved å flytte P1 i X-aksen)

Så det jeg er ute etter er hvordan kan jeg "snu det på hodet" slik at jeg kan definere endepunktene og lengden?
Håpte det var noen mattehoder her inne som har peiling :-k
Du har ikke de nødvendige tillatelsene for å vise filene som er tilknyttet dette innlegget.
Alle gode ting er 3D

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » tor 08 mai, 2014

Vet ikke helt om det er dette du er ute etter, men her kan du anngi lengde L og 2 endepunkter, pos0 og pos1. Dette fungerer så lenge L er lengre en distansen mellom punktene og at pos0.z < pos1.z (men det er lett å fikse på).

I scriptet så blir start- og endepunkt satt og kurven blir satt til å ha en lengde på 28 > distance pos0 pos1. De grønne punktene er samples av linjeformelen og til sammenligning er den røde linja er en spline med start- og endepunkt i pos0 og pos1 henholdsvis samt et smooth punkt fra linjeformelen midt i mellom start- og endepunktene.

Kode: Velg alt

(
   --delete $*
   clearListener()
   
   maxError = 1e-10
   maxIt = 100
   
   fn TV upper lower =
   (
      (upper + lower) * 0.5
   )
   
   /*
   fn atanh_ x =
   (
      0.5 * log ((1.0 + x) / (1.0 - x))
   )*/
   
   fn asinh x =
   (
      log (x + sqrt(1 + x * x))
   )
   
   fn cosh_ x =
   (
      0.5 * (e^x + e^-x)
   )
   
   fn calc_D a L h sgn =
   (
      q = 2.0 * sgn * sqrt(h * (a + h) * (L * L - a * a))
      ((L * L - a * a) * (a + 2.0 * h) - L * q) / (a * a) * (atanh (a * a / (L * (a + 2.0 * h) - q)))
   )
   
   fn solve_h a L d =
   (
      s = (L * L - a * a) / (2.0 * a) * log ((L + a) / (L - a))
      s = if s < d then -1.0 else 1.0
      lower = 0
      upper = (L - a) * 0.5
      n = 0
      while (upper - lower) > maxError and (n += 1) < maxIt do
      (
         if ((calc_d a L (TV upper lower) s) * s) < (d * s) then
            upper = TV upper lower
         else
            lower = TV upper lower
      )
      
      s * TV upper lower
   )
   
   fn calc_L1 h L a sgn =
   (
      ((h * l) + (sgn * sqrt (h * (a + h) * (L * L - a * a)))) / (-a)
   )
   
   fn calc_my h L1 =
   (
      (2.0 * h) / (L1 * L1 - h * h)
   )
   
   fn calc_x1 my L1 =
   (
      (asinh (my * L1)) / my
   )
   delete $k*
   delete $s*

   /* Example 2 from http://members.chello.nl/j.beentjes3/Ruud/catfiles/catenary.pdf*/
   
   point0 = if point0 != undefined then $Point001 else point pos:[0, 0, 10] wirecolor:blue
   point1 = if point1 != undefined then $Point002 else point pos: [0, 20, 15] wirecolor:blue
   
   pos0 = point0.pos
   pos1 = point1.pos
   vec = pos1 - pos0
   vecxy = [vec.x, vec.y, 0]
   dir = normalize vec
   L = 28
   d = distance [pos0.x, pos0.y] [pos1.x, pos1.y]
   
   if L < d then
      throw "The length can't be smaller than the distance between the endpoints"
   
   a = abs (pos0.z - pos1.z)
   h = solve_h a L d
   sign = if pos0.z < pos1.z then -1.0 else 1.0
   L1 = calc_L1 h L a sign
   my = calc_my h L1
   x1 = calc_x1 my L1
   k = pos0.z - h - (1.0 / my)
   steps = 20.0
   stepLength = d / (steps + 1)
   offset = amin pos0.z pos1.z
   /*
   print h
   print L1
   print my
   print x1
   print k
   OK
   */
   x2 = d * 0.5
   
   y2 = (cosh_ (my * x2 - my * x1) * (1.0 /my)) + k - offset
   
   ss = splineshape pos:pos0 wirecolor:red
   addNewSpline ss
   addKnot ss 1 #corner #curve pos0
   addKnot ss 1 #smooth #curve (pos0 + 0.5 * vecxy + [0, 0, y2])
   addKnot ss 1 #corner #curve pos1
   updateshape ss
         
   for i = 1.0 to steps do
   (      
      
      x = i * stepLength
      p = i / (steps + 1)
      y = (cosh_ (my * x - my * x1) * (1.0 /my)) + k - offset
      
      --point pos:(pos0 + [0, 0, y] + ([1, x, ] * dirXY)) name:"k" size:1 wirecolor:green
      point pos:(pos0 + p * vecxy + [0, 0, y]) name:"k" size:1 wirecolor:green
   )
   Ok
   
)


ref: http://members.chello.nl/j.beentjes3/Ru ... tenary.pdf
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet
http://folk.ntnu.no/havardsc/site/wordpress/

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » lør 10 mai, 2014

Her er en interaktiv versjon som oppdaterer kurven når du beveger på kontrollpunktene. Kurven har også en custom attribute hvor du kan anngi lengden på kurven.

Kode: Velg alt

(
   struct catenaryHelper
   (
      maxError = 1e-6,
      maxIt = 100,
      
      fn TV upper lower =
      (
         (upper + lower) * 0.5
      ),
            
      fn atanh_ x =
      (
         0.5 * log ((1.0 + x) / (1.0 - x))
      ),
      
      fn asinh x =
      (
         log (x + sqrt(1 + x * x))
      ),
      
      fn cosh_ x =
      (
         0.5 * (e^x + e^-x)
      ),
      
      fn calc_D a L h sgn =
      (
         q = 2.0 * sgn * sqrt(h * (a + h) * (L * L - a * a))
         ((L * L - a * a) * (a + 2.0 * h) - L * q) / (a * a) * (atanh_ (a * a / (L * (a + 2.0 * h) - q)))
      ),
      
      fn solve_h a L d =
      (
         s = (L * L - a * a) / (2.0 * a) * log ((L + a) / (L - a))
         s = if s < d then -1.0 else 1.0
         lower = 0
         upper = (L - a) * 0.5
         n = 0
         while (upper - lower) > maxError and (n += 1) < maxIt do
         (
            if ((calc_d a L (TV upper lower) s) * s) < (d * s) then
               upper = TV upper lower
            else
               lower = TV upper lower
         )
         
         s * TV upper lower
      ),
      
      fn calc_L1 h L a sgn =
      (
         ((h * l) + (sgn * sqrt (h * (a + h) * (L * L - a * a)))) / (-a)
      ),
      
      fn calc_my h L1 =
      (
         (2.0 * h) / (L1 * L1 - h * h)
      ),
      
      fn calc_x1 my L1 =
      (
         (asinh (my * L1)) / my
      ),
      
      fn createCatenaryCurve pA pB spline splineLength =
      (      
         local point0, point1, pos0, pos1
         
         if pA.pos.z > pB.pos.z then
         (
            point0 = pB
            point1 = pA
         )
         else
         (
            point0 = pA
            point1 = pB
         )
         pos0 = point0.pos
         pos1 = point1.pos
         
         vec = pos1 - pos0
         
         L = amax splineLength ((length vec) + 3)
         vecxy = [vec.x, vec.y, 0]
         dir = normalize vec
         d = distance [pos0.x, pos0.y] [pos1.x, pos1.y]
         
         a = abs (pos0.z - pos1.z)
         h = solve_h a L d
         sign = if pos0.z < pos1.z then -1.0 else 1.0
         L1 = calc_L1 h L a sign
         my = calc_my h L1
         x1 = calc_x1 my L1
         k = pos0.z - h - (1.0 / my)
         --steps = 20.0
         
         offset = amin pos0.z pos1.z
         
         count = (numKnots spline 1) - 1
         stepLength = d / (count + 1)
         setKnotPoint spline 1 1 pos0
         
         for i = 2 to count do
         (
            x = i * stepLength
            p = i / (count + 1.0)
            y = (cosh_ (my * x - my * x1) * (1.0 /my)) + k - offset
            
            setKnotPoint spline 1 i (pos0 + p * vecxy + [0, 0, y])
         )
         setKnotPoint spline 1 (count + 1) pos1
         updateShape spline
      ),
      
      fn createScriptController spline p0 p1 =
      (
         d = dummy()
         catenaryDataCA= attributes catenaryData
         (
            local p0_ = p0
            local p1_ = p1
            local spline_ = spline
            parameters main rollout:params
            (
               splineLength type:#float ui:splineLengthSpinner default:200
            )
            
            rollout params "Catenary Parameters"
            (
               spinner splineLengthSpinner "Length" type:#float range:[0,1e4, 200]
               
               on splineLengthSpinner changed val do
               (
                  ::catenaryStruct.createCatenaryCurve p0_ p1_ spline_ val
               )
            )
         )
         CustAttributes.add spline catenaryDataCA
         
         scriptController = position_script()
         scriptController.addNode "spline" spline
         scriptController.addNode "p0" p0
         scriptController.addNode "p1" p1
         scriptController.script = "" + \
         "::catenaryStruct.createCatenaryCurve p0 p1 spline spline.splinelength\n" + \
         "p0.pos + 0.5 * (p1.pos - p0.pos)"
         
         d.pos.controller = scriptController
      ),
      
      fn createSpline knotsCount pos0 pos1 =
      (
         ss = splineshape  wirecolor:red
         addNewSpline ss
         addKnot ss 1 #smooth #curve pos0
         vec = pos1 - pos0
         for i = 1.0 to knotsCount do
         (      
            
            p = i / (knotsCount + 1)
            addKnot ss 1 #smooth #curve (pos0 + p * vec)
         )
         addKnot ss 1 #smooth #curve pos1
         updateshape ss
         ss
      )
   )
   
   -- Example usage:
   ::catenaryStruct = catenaryHelper()
   s = catenaryStruct.createSpline 20 [0,0,0] [0, 1, 0]
   catenaryStruct.createScriptController s (point()) (point pos:[0, 100, 25])
)
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/

Brukeravatar

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

Legg innav tassel » søn 11 mai, 2014

Interesant :)

Det jeg registrerer med dette scriptet ditt er at når den blir for lang (noe den ikke burde få lov til) så klikker splinen helt. Splinene burde alltid holde sin eksakte lengde. Er det ikke noe slikt du er ute etter Lars? Jobber du med looper? ;)

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 11 mai, 2014

Den klikker fordi L blir for liten, jeg prøvde å legge inn en sjekk for det:

Kode: Velg alt

L = amax splineLength ((length vec) + 3)

men la inn at splinen blir rød og "stram" hvis verdien av custom attributen er mindre en distansen mellom endepunktene istedet. La også custom attributsa på en egen modifier på toppen av splinen så de ikke blir så bortgjemt.

Kode: Velg alt

(
   struct catenaryHelper
   (
      maxError = 1e-6,
      maxIt = 100,
      
      fn TV upper lower =
      (
         (upper + lower) * 0.5
      ),
            
      fn atanh_ x =
      (
         0.5 * log ((1.0 + x) / (1.0 - x))
      ),
      
      fn asinh x =
      (
         log (x + sqrt(1 + x * x))
      ),
      
      fn cosh_ x =
      (
         0.5 * (e^x + e^-x)
      ),
      
      fn calc_D a L h sgn =
      (
         q = 2.0 * sgn * sqrt(h * (a + h) * (L * L - a * a))
         ((L * L - a * a) * (a + 2.0 * h) - L * q) / (a * a) * (atanh_ (a * a / (L * (a + 2.0 * h) - q)))
      ),
      
      fn solve_h a L d =
      (
         s = (L * L - a * a) / (2.0 * a) * log ((L + a) / (L - a))
         s = if s < d then -1.0 else 1.0
         lower = 0
         upper = (L - a) * 0.5
         n = 0
         while (upper - lower) > maxError and (n += 1) < maxIt do
         (
            if ((calc_d a L (TV upper lower) s) * s) < (d * s) then
               upper = TV upper lower
            else
               lower = TV upper lower
         )
         
         s * TV upper lower
      ),
      
      fn calc_L1 h L a sgn =
      (
         ((h * l) + (sgn * sqrt (h * (a + h) * (L * L - a * a)))) / (-a)
      ),
      
      fn calc_my h L1 =
      (
         (2.0 * h) / (L1 * L1 - h * h)
      ),
      
      fn calc_x1 my L1 =
      (
         (asinh (my * L1)) / my
      ),
      
      fn createCatenaryCurve pA pB spline splineLength =
      (      
         local point0, point1, pos0, pos1
         
         if pA.pos.z == pB.pos.z do
            pA.pos.z += 1
         if pA.pos.z > pB.pos.z then
         (
            point0 = pB
            point1 = pA
         )
         else
         (
            point0 = pA
            point1 = pB
         )
         pos0 = point0.pos
         pos1 = point1.pos
         
         vec = pos1 - pos0
                  
         if (length vec) > splineLength then
         (
            count = (numKnots spline 1) - 1
            setKnotPoint spline 1 1 pos0
            
            for i = 2 to count do
            (
               p = (i - 1) / (count + 1.0)
               setKnotPoint spline 1 i (pos0 + p * vec)
            )
            setKnotPoint spline 1 (count + 1) pos1
            updateShape spline
            spline.wirecolor = red
            return OK
         )
         spline.wirecolor = green
         L = amax splineLength ((length vec) * 1.005)
         vecxy = [vec.x, vec.y, 0]
         dir = normalize vec
         d = distance [pos0.x, pos0.y] [pos1.x, pos1.y]
         
         a = abs (pos0.z - pos1.z)
         h = solve_h a L d
         sign = if pos0.z < pos1.z then -1.0 else 1.0
         L1 = calc_L1 h L a sign
         my = calc_my h L1
         x1 = calc_x1 my L1
         k = pos0.z - h - (1.0 / my)
         --steps = 20.0
         
         offset = amin pos0.z pos1.z
         
         count = numKnots spline 1
         stepLength = d / (count as float)
         setKnotPoint spline 1 1 pos0
         
         for i = 2 to (count - 1) do
         (
            x = (i - 0.5)  * stepLength
            p = (i - 0.5) / (count as float)
            z = (cosh_ (my * x - my * x1) * (1.0 /my)) + k - offset

            setKnotPoint spline 1 i (pos0 + p * vecxy + [0, 0, z])
         )
         setKnotPoint spline 1 count pos1
         updateShape spline
      ),
      
      fn createScriptController spline p0 p1 =
      (
         d = dummy()
         catenaryDataCA= attributes catenaryData
         (
            local p0_ = p0
            local p1_ = p1
            local spline_ = spline
            parameters main rollout:params
            (
               splineLength type:#float ui:splineLengthSpinner default:200
            )
            
            rollout params "Catenary Parameters"
            (
               spinner splineLengthSpinner "Length" type:#float range:[0,1e4, 200]
               
               on splineLengthSpinner changed val do
               (
                  ::catenaryStruct.createCatenaryCurve p0_ p1_ spline_ val
               )
            )
         )
         em = emptyModifier name:"Catenary parameteres"
         CustAttributes.add em catenaryDataCA
         addModifier spline em
         scriptController = position_script()
         scriptController.addNode "spline" spline
         scriptController.addNode "p0" p0
         scriptController.addNode "p1" p1
         scriptController.script = "" + \
         "::catenaryStruct.createCatenaryCurve p0 p1 spline spline.modifiers[\"Catenary parameteres\"].splinelength\n" + \
         "p0.pos + 0.5 * (p1.pos - p0.pos)"
         
         d.pos.controller = scriptController
      ),
      
      fn createSpline knotsCount pos0 pos1 =
      (
         ss = splineshape  wirecolor:red
         addNewSpline ss
         addKnot ss 1 #smooth #curve pos0
         vec = pos1 - pos0
         for i = 1.0 to knotsCount do
         (      
            
            p = i / (knotsCount + 1)
            addKnot ss 1 #smooth #curve (pos0 + p * vec)
         )
         addKnot ss 1 #smooth #curve pos1
         updateshape ss
         ss
      )
   )
   
   -- Example usage:
   delete $*
   ::catenaryStruct = catenaryHelper()
   s = catenaryStruct.createSpline 20 [0,0,0] [0, 1, 0]
   catenaryStruct.createScriptController s (point()) (point pos:[0, 100, 25])
)
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/

Brukeravatar

Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » tir 13 mai, 2014

Knall script! :)
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

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

Legg innav tassel » tir 13 mai, 2014

Enig =D>

Det fortjener en pen innpakning og en tur på scriptspot dette håvard :)

Brukeravatar

Trådstarter
larsem8
Innlegg: 1506
Registrert: ons 09 nov, 2005
Sted: Kristiansand

Legg innav larsem8 » tir 13 mai, 2014

=D>
Det er bra det finnes noen genier her!
Spurte bare etter noen hint men :P
Alle gode ting er 3D

Brukeravatar

Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » tor 15 mai, 2014

Ser ikke ut som det liker å bli lagret i en scene forresten.. Får feilmeldinger når den da åpnes igjen.

Bilde
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

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

Legg innav tassel » tor 15 mai, 2014

Bad free thunk local member index when accessing local: p0

:)

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » tor 15 mai, 2014

Jeg lagrer aldri!
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » tor 15 mai, 2014

Quick fix:

Kode: Velg alt

(
   struct catenaryHelper
   (
      
      
      fn createScriptController spline p0 p1 =
      (
         
         
         catenaryDataCA= attributes catenaryData
         (
            local maxError = 1e-6
            local maxIt = 100
            
            fn TV upper lower =
            (
               (upper + lower) * 0.5
            )
                  
            fn atanh_ x =
            (
               0.5 * log ((1.0 + x) / (1.0 - x))
            )
            
            fn asinh x =
            (
               log (x + sqrt(1 + x * x))
            )
            
            fn cosh_ x =
            (
               0.5 * (e^x + e^-x)
            )
            
            fn calc_D a L h sgn =
            (
               q = 2.0 * sgn * sqrt(h * (a + h) * (L * L - a * a))
               ((L * L - a * a) * (a + 2.0 * h) - L * q) / (a * a) * (atanh_ (a * a / (L * (a + 2.0 * h) - q)))
            )
            
            fn solve_h a L d =
            (
               s = (L * L - a * a) / (2.0 * a) * log ((L + a) / (L - a))
               s = if s < d then -1.0 else 1.0
               lower = 0
               upper = (L - a) * 0.5
               n = 0
               while (upper - lower) > maxError and (n += 1) < maxIt do
               (
                  if ((calc_d a L (TV upper lower) s) * s) < (d * s) then
                     upper = TV upper lower
                  else
                     lower = TV upper lower
               )
               
               s * TV upper lower
            )
            
            fn calc_L1 h L a sgn =
            (
               ((h * l) + (sgn * sqrt (h * (a + h) * (L * L - a * a)))) / (-a)
            )
            
            fn calc_my h L1 =
            (
               (2.0 * h) / (L1 * L1 - h * h)
            )
            
            fn calc_x1 my L1 =
            (
               (asinh (my * L1)) / my
            )
            
            fn createCatenaryCurve pA pB spline splineLength =
            (      
               local point0, point1, pos0, pos1
               
               if pA.pos.z == pB.pos.z do
                  pA.pos.z += 1
               if pA.pos.z > pB.pos.z then
               (
                  point0 = pB
                  point1 = pA
               )
               else
               (
                  point0 = pA
                  point1 = pB
               )
               pos0 = point0.pos
               pos1 = point1.pos
               
               vec = pos1 - pos0
                        
               if (length vec) > splineLength then
               (
                  count = (numKnots spline 1) - 1
                  setKnotPoint spline 1 1 pos0
                  
                  for i = 2 to count do
                  (
                     p = (i - 1) / (count + 1.0)
                     setKnotPoint spline 1 i (pos0 + p * vec)
                  )
                  setKnotPoint spline 1 (count + 1) pos1
                  updateShape spline
                  spline.wirecolor = red
                  return OK
               )
               spline.wirecolor = green
               L = amax splineLength ((length vec) * 1.005)
               vecxy = [vec.x, vec.y, 0]
               dir = normalize vec
               d = distance [pos0.x, pos0.y] [pos1.x, pos1.y]
               
               a = abs (pos0.z - pos1.z)
               h = solve_h a L d
               sign = if pos0.z < pos1.z then -1.0 else 1.0
               L1 = calc_L1 h L a sign
               my = calc_my h L1
               x1 = calc_x1 my L1
               k = pos0.z - h - (1.0 / my)
               --steps = 20.0
               
               offset = amin pos0.z pos1.z
               
               count = numKnots spline 1
               stepLength = d / (count as float)
               setKnotPoint spline 1 1 pos0
               
               for i = 2 to (count - 1) do
               (
                  x = (i - 0.5)  * stepLength
                  p = (i - 0.5) / (count as float)
                  z = (cosh_ (my * x - my * x1) * (1.0 /my)) + k - offset

                  setKnotPoint spline 1 i (pos0 + p * vecxy + [0, 0, z])
               )
               setKnotPoint spline 1 count pos1
               updateShape spline
            )
            
            parameters main rollout:params
            (
               splineLength type:#float ui:splineLengthSpinner default:200
               point0 type:#node
               point1 type:#node
               spline type:#node
            )
            
            rollout params "Catenary Parameters"
            (
               spinner splineLengthSpinner "Length" type:#float range:[0,1e4, 200]
               
               on splineLengthSpinner changed val do
               (
                  deps = (refs.dependents ((refs.dependents this)[1]))
                  for d in deps where classof d == SplineShape do
                     if point0 != undefined and point1 != undefined  do
                        this.createCatenaryCurve point0 point1 d val
               )
            )
         )
                  
         em = emptyModifier name:"Catenary parameters"
         CustAttributes.add em catenaryDataCA
         addModifier spline em
         
         em.point0 = p0
         em.point1 = p1
         --em.spline = spline
         
         scriptController = position_script()
         scriptController.addNode "spline" spline
         scriptController.addNode "p0" p0
         scriptController.addNode "p1" p1
         scriptController.script = "" + \
         "cmod = spline.modifiers[\"Catenary parameters\"]\n" + \
         "cmod.createCatenaryCurve p0 p1 spline cmod.splineLength\n" + \
         "p0.pos + 0.5 * (p1.pos - p0.pos)"
         
         d = dummy()
         d.pos.controller = scriptController
      ),
      
      fn createSpline knotsCount pos0 pos1 =
      (
         ss = splineshape  wirecolor:red
         addNewSpline ss
         addKnot ss 1 #smooth #curve pos0
         vec = pos1 - pos0
         for i = 1.0 to knotsCount do
         (      
            
            p = i / (knotsCount + 1)
            addKnot ss 1 #smooth #curve (pos0 + p * vec)
         )
         addKnot ss 1 #smooth #curve pos1
         updateshape ss
         ss
      )
   )
   
   -- Example usage:
   --delete $*
   local catenaryStruct = catenaryHelper()
   s = catenaryStruct.createSpline 1 [0,0,0] [0, 1, 0]
   catenaryStruct.createScriptController s (point()) (point pos:[0, 100, 25])
)
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/

Brukeravatar

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

Legg innav tassel » tor 15 mai, 2014

havards skrev:Jeg lagrer aldri!


Haha :D

Brukeravatar

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

Legg innav tassel » man 19 mai, 2014

Du som er et geni-barn, burde jo legge inn funksjonalitet for å kontrolere denne også:

Bilde


Gå tilbake til «Animering og rigging»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 2 gjester

cron