This is a test project with unicorns i made in cinema that i am controlling with a leap motion controller. I used the sample.py with the leap developer SDK, and adapted it slightly to send out position data for each finger over UDP. I have tried to send data directly from a leap to my 3d software, but to no avail.
(sorry the video is quite bad, i’ll film a better one soon)
Here is the code from the leap:
[python]
import Leap, sys, thread, time
import socket
fingerDict = {}
UDP_IP = "172.16.100.61" #local host
UDP_PORT = 7864
#sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
class SampleListener(Leap.Listener):
finger_names = [‘Thumb’, ‘Index’, ‘Middle’, ‘Ring’, ‘Pinky’]
bone_names = [‘Metacarpal’, ‘Proximal’, ‘Intermediate’, ‘Distal’]
def on_init(self, controller):
print "Initialized"
def on_connect(self, controller):
print "Connected"
def on_disconnect(self, controller):
# Note: not dispatched when running in a debugger.
print "Disconnected"
def on_exit(self, controller):
print "Exited"
def on_frame(self, controller):
# Get the most recent frame and report some basic information
frame = controller.frame()
for hand in frame.hands:
# Get fingers
for finger in hand.fingers:
#print "%s finger" % (self.finger_names[finger.type])
fingerType = self.finger_names[finger.type]
# Get bones
for b in range(3, 4): # distal bone is the finger tip
bone = finger.bone(b)
#print " Bone: %s: %s" % (self.bone_names[bone.type],bone.center[1]) # obtain just the y value of the fingers
ypos = (int(bone.center[1]))
fingerDict[fingerType] = ypos
MESSAGE = str(fingerDict)
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
print MESSAGE
if not frame.hands.is_empty:
print ""
def main():
# Create a sample listener and controller
listener = SampleListener()
controller = Leap.Controller()
# Have the sample listener receive events from the controller
controller.add_listener(listener)
# Keep this process running until Enter is pressed
print "Press Enter to quit…"
try:
sys.stdin.readline()
except KeyboardInterrupt:
pass
finally:
# Remove the sample listener when done
controller.remove_listener(listener)
if __name__ == "__main__":
main()
[/python]
And here is the receiver code in cinema applied to 5 cloned unicorns:
[python]
import c4d
from c4d.modules import mograph as mo
import socket
UDP_IP = "192.168.1.12"
UDP_PORT = 7864
def main():
md = mo.GeGetMoData(op)
if md is None: return False
cnt = md.GetCount()
marr = md.GetArray(c4d.MODATA_MATRIX)
fall = md.GetFalloffs()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
#print "received message:", data
sock.close()
fingerdictC4D = eval(data) # convert to dictionary again from string
fingers = [‘Thumb’, ‘Index’, ‘Middle’, ‘Ring’, ‘Pinky’] # list to sort the dictionary
#get position y of each unicorn
marrNew = [] # new vectors matrix
for im,m in enumerate(marr):
positions = m.off #obtain position data
xpos = positions[0]
ypos = positions[1]
ypos = fingerdictC4D[fingers[im]]
zpos = positions[2]
off = c4d.Vector(xpos,ypos,zpos)
newMatrix = c4d.Matrix(off)
marrNew.append(newMatrix)
#set new position vector with new leap yposiiton
#create new matrix
#append matrix to empty list
#set new y position for each clone
setNewArr = md.SetArray(c4d.MODATA_MATRIX,marrNew,False) # set new cloner matrix
#each finger is linked to each row
[/python]
George Martin Jr March 15, 2019
Hello there,
My name is George, and I was wondering if you would like to have your website anam-ation.com promoted as a resource on my blog georgemartjr.com ?
We are updating our broken link resources to include up to date resources for our readers. Our resource links are manually approved as a do follow link.
If you are interested in having your site included as a resource on our blog, please let me know.
Thanks
George