2016-12-20 1 views
0

J'envoie constamment la matrice de position d'une caméra via UDP depuis Houdini et la positionne dans Cinema4d. Les deux sont des logiciels 3D. Les données sont correctes mais Cinema4d se bloque et est lent lors de la mise à jour de la matrice depuis houdini. Pourquoi cela arrive-t-il?Pourquoi un logiciel ralentit-il lors de la réception de données d'un autre via UDP (python)?

est ici le code python j'envoie de Houdini:

import socket 

UDP_IP = '192.168.1.8' 
UDP_PORT = 7864 

cam = hou.selectedNodes() 
camerac4d = hou.node('/obj/obj_andcamera/cam1') 
xform = camerac4d.worldTransform() #get the camera matrix 
data_string = str(xform) 

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # UDP 
sock.sendto(data_string, (UDP_IP, UDP_PORT)) 

récepteur UDP dans le cinéma 4d:

import socket 

def main(): 
    operateon = doc.SearchObject('Camera') #get cinema 4d camera 

    UDP_IP = '192.168.1.8' 
    UDP_PORT = 7864 

    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
    sock.bind((UDP_IP,UDP_PORT)) 
    data_string,addr = sock.recvfrom(1024) 


    data_string = ast.literal_eval(data_string) #converts string list 


    #set houdini matrix to cinema 4d camera 

    off = v(newlist[3][0],newlist[3][1], -newlist[3][2]) 
    v1 = v(-newlist[0][0],newlist[0][1], newlist[0][2]) 
    v2 = v(-newlist[1][0], -newlist[1][1], -newlist[1][2]) 
    v3 = v(-newlist[2][0], -newlist[2][1], newlist[2][2]) 

    mat = c4d.Matrix(off,v1*-1,v2*-1,v3) 

    newpos = operateon.SetMg(mat) 

Répondre

0

donc je me suis dit dehors Je devais tenir le réglage de la matrice dans une boucle while qui est morte après 5 essais de sorte que cinema4d ne planterait pas, puis a dû mettre à jour la fenêtre dans le cinéma avec une ligne de code qui actualise la fenêtre chaque fois que la matrice est mise à jour il fin

def main():

operateon = doc.SearchObject('Camera') #find and set the cinema camera 

##UDP receive transformation matrix from houdini## 

UDP_IP = 'localhost' 
UDP_PORT = 7864 

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

sock.bind((UDP_IP,UDP_PORT)) 
##kill the connection after 5 viewport updates/works but stupid/but it stops cinema from freezing on an endless while loop 
die = 0 
while die < 5: 
    die += 1 
    data_string, addr = sock.recvfrom(1024) 

# set each vector component 
    data_string = ast.literal_eval(data_string) #converts string to list 

    #a hou matrix is 4x4, cinema is a 3x4 matrix consisting of :off=position data, v1,v2,v3 stores the scale,rotation and shear 
    index = 3 #Delete column 3 
    newlist = [ (x[0:index] + x[index+1:]) for x in data_string] 
#print newlist 
#---------------------set vectors for matrix---------------------------------# 
    off = v(newlist[3][0],newlist[3][1], -newlist[3][2]) 
    v1 = v(-newlist[0][0],newlist[0][1], newlist[0][2]) 
    v2 = v(-newlist[1][0], -newlist[1][1], -newlist[1][2]) 
    v3 = v(-newlist[2][0], -newlist[2][1], newlist[2][2]) 

#---------------------create a matrix and set it---------------------------------# 

    mat = c4d.Matrix(off,v1*-1,v2*-1,v3) 
    newpos = operateon.SetMg(mat) 


    #update the viewport with the new matrix 
    c4d.EventAdd() 
    c4d.DrawViews(c4d.DRAWFLAGS_ONLY_ACTIVE_VIEW|c4d.DRAWFLAGS_NO_THREAD|c4d.DRAWFLAGS_NO_REDUCTION|c4d.DRAWFLAGS_STATICBREAK)