Browse Source

maxlen-style pathing

Johann Woelper 8 years ago
parent
commit
086c3fab78
2 changed files with 70 additions and 64 deletions
  1. BIN
      procwalk/walk.hiplc
  2. 70 64
      procwalk/walk.py

BIN
procwalk/walk.hiplc


+ 70 - 64
procwalk/walk.py

@@ -3,20 +3,16 @@ import math
 import random
 
 
-
-
 this_node = hou.pwd()
-
-
-
-parent = hou.node('../model/')
-
+parent = this_node.inputs()[0]
 legs = hou.node('../l_parents').outputs()
-#legs = hou.node(this_node.parm('leg_root').eval()).outputs()
-
-#print legs
+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())
@@ -26,9 +22,8 @@ def lerp(t, a, b):
     return a + t * (b - a)
 
 def roundVec(v, fac, seed):
-
     #seed = random.random()*0.1
-    seed = 0.1*seed
+    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
@@ -42,13 +37,33 @@ def floorVec(v, fac, seed):
     return hou.Vector3(x, y, z)
 
 
+def find_nearest(v, node, maxdist=1.5):
+    #TODO probably take the nearest topmost point
+    geo = node.displayNode().geometry()
+    nearest = [maxdist, None]
+    for p in  geo.points():
+        dist = p.position().distanceTo(v)
+        if dist < nearest[0]:
+            nearest[0] = dist
+            nearest[1] = p.position()
+    return nearest[1]
+
 
 # /// setup
 def distribute_legs():
     spacing = 1
     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))
+        #t = hou.hmath.buildTranslate(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)
@@ -59,116 +74,107 @@ def distribute_legs():
 
 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
 
     if index < legs_per_side:
-        t = hou.hmath.buildTranslate(2, 0, index*spacing-offset)
-        leg.setParmTransform(t*parent_wt)
+        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
     else:
-        t = hou.hmath.buildTranslate(-2, 0, (index*spacing-legs_per_side*spacing)-offset)
-        leg.setParmTransform(t*parent_wt)
+        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
-        
+
 
 # /// movement
 def move_legs_insect():
     distribute_legs()
     for no, leg in enumerate(legs):
-
-        #print 'leg', leg
         lt = hou.Vector3(leg.parmTuple("t").eval())
-        #print lt
-
         #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
-
+        #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)
 
-
-move_legs_insect()
-
-def move_legs_maxlen():
-    maxlen = 2.6
-    minlen = 1.7
+def move_legs_gnd():
+    distribute_legs()
+    
     for no, leg in enumerate(legs):
-
         lt = hou.Vector3(leg.parmTuple("t").eval())
-       
-        #print lt
-        lt_r = roundVec(lt, 1, no)
-        d = lt_r.distanceTo(parent_transform)
-        print 'DIST', d
-
-        if d > maxlen or d < minlen:
-            #r = leg_restpos(leg, no, len(legs))
-            #t = hou.hmath.buildTranslate(r)
-            #leg.setParmTransform(t)
-            print leg_restpos(leg, no, len(legs))
-
-        else:
-            t = hou.hmath.buildTranslate(lt_r[0], 0, lt_r[2])
+        next_p = find_nearest(lt, ground)
+        dist = next_p.distanceTo(leg.restpos)
+        #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])
             leg.setParmTransform(t)
+            
+            
+        else:
+            pass
+            #t = hou.hmath.buildTranslate(next_p[0], next_p[1], next_p[2])
+            #leg.setParmTransform(t)
+            
 
-#move_legs_maxlen()
 
 
-if hou.frame() == 1:
-    """
-    delete all keyframes if rewound
-    """
-    for no, leg in enumerate(legs):
-        parm = leg.parmTuple("t")
-        parm.deleteAllKeyframes()
+def remove_keyframes():
+    if hou.frame() == 1:
+        """
+        delete all keyframes if rewound
+        (@ frame 1)
+        """
+        for leg in legs:
+            parm = leg.parmTuple("t")
+            parm.deleteAllKeyframes()
 
 
 def set_keys():
     """
     Set keyframe for all legs
     """
-    for no, leg in enumerate(legs):
-
+    for leg in legs:
         pos = hou.Vector3(leg.parmTuple("t").eval())
-
         kfx = hou.Keyframe()
         kfx.setFrame(hou.frame())
         kfx.setValue(pos[0])
-
         kfy = hou.Keyframe()
         kfy.setFrame(hou.frame())
         kfy.setValue(pos[1])
-
         kfz = hou.Keyframe()
         kfz.setFrame(hou.frame())
         kfz.setValue(pos[2])
-
         tchanx = hou.parm('../' + leg.name() + '/tx')
         tchany = hou.parm('../' + leg.name() + '/ty')
         tchanz = hou.parm('../' + leg.name() + '/tz')
-
         tchanx.setKeyframe(kfx)
         tchany.setKeyframe(kfy)
         tchanz.setKeyframe(kfz)
 
 
-set_keys()
+move_legs_gnd()
+#remove_keyframes()
+#distribute_legs()
+#set_keys()