Browse Source

intermediate working version

Johann Woelper 8 years ago
parent
commit
802451bed5
2 changed files with 90 additions and 92 deletions
  1. BIN
      procwalk/walk.hiplc
  2. 90 92
      procwalk/walk.py

BIN
procwalk/walk.hiplc


+ 90 - 92
procwalk/walk.py

@@ -3,45 +3,33 @@ import math
 import random
 
 
-this_node = hou.pwd()
-parent = this_node.inputs()[0]
-legs = hou.node('../l_parents').outputs()
-ground = hou.node('../ground')
-
-#legs = hou.node(this_node.parm('leg_root').eval()).outputs()
-
-for l in legs:
-    pass
-    #print 'leg', l
-
-parent_wt = parent.worldTransform()
-parent_transform = hou.Vector3(parent.parmTuple("t").eval())
-
 # /// utils
 def lerp(t, a, b):
     return a + t * (b - a)
 
+
 def roundVec(v, fac, seed):
     #seed = random.random()*0.1
-    seed = 0.1*seed - 0.05*seed
-    x = (round(v[0]*fac + seed))/fac
-    y = (round(v[1]*fac + seed))/fac
-    z = (round(v[2]*fac + seed))/fac
+    seed = 0.1 * seed - 0.05 * seed
+    x = (round(v[0] * fac + seed)) / fac
+    y = (round(v[1] * fac + seed)) / fac
+    z = (round(v[2] * fac + seed)) / fac
     return hou.Vector3(x, y, z)
 
+
 def floorVec(v, fac, seed):
-    seed = 0.1*seed
-    x = (math.floor(v[0]*fac + seed))/fac
-    y = (math.floor(v[1]*fac + seed))/fac
-    z = (math.floor(v[2]*fac + seed))/fac
+    seed = 0.1 * seed
+    x = (math.floor(v[0] * fac + seed)) / fac
+    y = (math.floor(v[1] * fac + seed)) / fac
+    z = (math.floor(v[2] * fac + seed)) / fac
     return hou.Vector3(x, y, z)
 
 
-def find_nearest(v, node, maxdist=1.5):
-    #TODO probably take the nearest topmost point
+def find_nearest(v, node, maxdist=4):
+    # TODO probably take the nearest topmost point
     geo = node.displayNode().geometry()
     nearest = [maxdist, None]
-    for p in  geo.points():
+    for p in geo.points():
         dist = p.position().distanceTo(v)
         if dist < nearest[0]:
             nearest[0] = dist
@@ -52,92 +40,70 @@ def find_nearest(v, node, maxdist=1.5):
 # /// setup
 def distribute_legs():
     spacing = 1
-    legs_per_side = round(len(legs)/2)
-    offset = (spacing * legs_per_side - spacing)/2
+    legs_per_side = round(len(LEGS) / 2)
+    offset = (spacing * legs_per_side - spacing) / 2
 
-    for no, leg in enumerate(legs):
-        #print leg.name(), no
-        p = leg_restpos(leg, no, len(legs))
+    for no, leg in enumerate(LEGS):
+        # print leg.name(), no
+        p = leg_restpos(leg, no, len(LEGS))
         #t = hou.hmath.buildTranslate(p)
-        #leg.setParmTransform(p)
+        # leg.setParmTransform(p)
         leg.restpos = p.extractTranslates()
 
-        continue
-        
-        if no < legs_per_side:
-            t = hou.hmath.buildTranslate(2, 0, no*spacing-offset)
-            leg.setParmTransform(t*parent_wt)
-        else:
-            t = hou.hmath.buildTranslate(-2, 0, (no*spacing-legs_per_side*spacing)-offset)
-            leg.setParmTransform(t*parent_wt)
+
+def place_legs():
+    for no, leg in enumerate(LEGS):
+        # print leg.name(), no
+        p = leg_capturepos(leg)
+        leg.restpos = p.extractTranslates()
 
 
 def leg_restpos(leg, index, maxlegs):
     spacing = 1
     side_factor = 2
-    legs_per_side = round(maxlegs/2)
-    offset = (spacing * legs_per_side - spacing)/2
-    #d = lt_r.distanceTo(parent_transform)*0.3
+    legs_per_side = round(maxlegs / 2)
+    offset = (spacing * legs_per_side - spacing) / 2
+    #d = lt_r.distanceTo(PARENT_TRANSFORM)*0.3
 
     if index < legs_per_side:
-        leg_pos = index*spacing-offset
-        x = side_factor - math.fabs(leg_pos)*0.2        
+        leg_pos = index * spacing - offset
+        x = side_factor - math.fabs(leg_pos) * 0.2
         t = hou.hmath.buildTranslate(x, 0, leg_pos)
-        #leg.setParmTransform(t*parent_wt)
-        return t*parent_wt
+        # leg.setParmTransform(t*PARENT_WT)
+        return t * PARENT_WT
     else:
-        leg_pos = (index*spacing-legs_per_side*spacing)-offset
-        x = side_factor - math.fabs(leg_pos)*0.2        
+        leg_pos = (index * spacing - legs_per_side * spacing) - offset
+        x = side_factor - math.fabs(leg_pos) * 0.2
         t = hou.hmath.buildTranslate(-x, 0, leg_pos)
-        #leg.setParmTransform(t*parent_wt)
-        return  t*parent_wt
+        # leg.setParmTransform(t*PARENT_WT)
+        return t * PARENT_WT
 
 
-# /// movement
-def move_legs_insect():
-    distribute_legs()
-    for no, leg in enumerate(legs):
-        lt = hou.Vector3(leg.parmTuple("t").eval())
-        #print roundVec(lt, 3)
-        #offset = 0.05*no
-        #lt_r = hou.Vector3(round(lt[0]+offset), round(lt[1]), round(lt[2]+offset))
-        lt_r = roundVec(lt, 1, no)
-        #d = lt.distanceTo(lt_r)
-        d = lt_r.distanceTo(parent_transform)*0.3
-        #print 'dist', d
-        #t = hou.hmath.buildTranslate(lt_r[0], 0, lt_r[2])
-        #t = hou.hmath.buildTranslate(round(lt[0]+offset), 0, round(lt[2]+offset))
-        #this_node.parmTuple('snap_l' + str(no+1) ).set(hou.Vector3(lt_r[0], lt_r[1], lt_r[2]))
-        ramp = this_node.parm('p_ramp').eval()
-        ramp_up = this_node.parm('p_up').eval()
-        #print ramp.lookup(d)
-        intp_x = lerp(ramp.lookup(d), lt[0], lt_r[0])
-        intp_z = lerp(ramp.lookup(d), lt[2], lt_r[2])
-        intp_y = ramp_up.lookup(d)
-        t = hou.hmath.buildTranslate(intp_x, intp_y, intp_z)
-        leg.setParmTransform(t)
+def leg_capturepos(leg):
+    p = leg.capture_pos
+    t = hou.hmath.buildTranslate(p[0], p[1], p[2])
+    return t * PARENT_WT
+
 
 def move_legs_gnd():
-    distribute_legs()
-    
-    for no, leg in enumerate(legs):
+    # distribute_legs()
+    place_legs()
+
+    for no, leg in enumerate(LEGS):
         lt = hou.Vector3(leg.parmTuple("t").eval())
-        next_p = find_nearest(lt, ground)
+        next_p = find_nearest(lt, GROUND)
         dist = next_p.distanceTo(leg.restpos)
-        #print dist
+        print dist
         if dist > 0.6:
-            #print 'setting', leg
-            next_restp = find_nearest(leg.restpos, ground)
-            t = hou.hmath.buildTranslate(next_restp[0], next_restp[1], next_restp[2])
+            # print 'setting', leg
+            next_restp = find_nearest(leg.restpos, GROUND)
+            t = hou.hmath.buildTranslate(
+                next_restp[0], next_restp[1], next_restp[2])
             leg.setParmTransform(t)
-            
-            
         else:
             pass
             #t = hou.hmath.buildTranslate(next_p[0], next_p[1], next_p[2])
-            #leg.setParmTransform(t)
-            
-
+            # leg.setParmTransform(t)
 
 
 def remove_keyframes():
@@ -146,7 +112,7 @@ def remove_keyframes():
         delete all keyframes if rewound
         (@ frame 1)
         """
-        for leg in legs:
+        for leg in LEGS:
             parm = leg.parmTuple("t")
             parm.deleteAllKeyframes()
 
@@ -155,7 +121,7 @@ def set_keys():
     """
     Set keyframe for all legs
     """
-    for leg in legs:
+    for leg in LEGS:
         pos = hou.Vector3(leg.parmTuple("t").eval())
         kfx = hou.Keyframe()
         kfx.setFrame(hou.frame())
@@ -174,7 +140,39 @@ def set_keys():
         tchanz.setKeyframe(kfz)
 
 
-move_legs_gnd()
-#remove_keyframes()
-#distribute_legs()
-#set_keys()
+# globals
+THIS_NODE = hou.pwd()
+PARENT = THIS_NODE.inputs()[0]
+LEGS = hou.node('../l_parents').outputs()
+GROUND = hou.node('../ground')
+CAPTURE_FRAME = 1
+#legs = hou.node(THIS_NODE.parm('leg_root').eval()).outputs()
+PARENT_WT = PARENT.worldTransform()
+#PARENT_TRANSFORM = hou.Vector3(PARENT.parmTuple("t").eval())
+
+
+def main():
+    # This is our 'capture' frame
+
+    if hou.frame() == CAPTURE_FRAME:
+        """
+        Basically, do nothing in the capture frame.
+        Just store the actual leg position in the up vector
+        to access it in any other frame as the capture position.
+        """
+        for leg in LEGS:
+            # we use the up vector to store the capture pose per leg
+            pos = hou.Vector3(leg.parmTuple("t").eval())
+            leg.parmTuple('up').set(pos)
+            print leg, pos
+            leg.capture_pos = pos
+        # move_legs_gnd()
+    else:
+        # do the dance
+        for leg in LEGS:
+            p = hou.Vector3(leg.parmTuple("up").eval())
+            leg.capture_pos = p
+        move_legs_gnd()
+
+
+main()