2013-02-10 47 views
1

我有一個Blender代碼,它從csv文件中獲取一組數據,並使用它們在Game Engine中旋轉機器人手臂和人體模型。此代碼工作正常,但現在我想通過無線連接向Blender發送數據。在Blender中以無線方式讀取數據時運行遊戲引擎

我有一個服務器代碼在攪拌機(運行在Python 3中)

# Server Program 
# Make sure the client is being run on the data generation computer 

SERVER_LOOP = True 

import socket 
import sys 
import json 
import bge 

cont = bge.logic.getCurrentController() 
owner = cont.owner 

print ('INFO: Starting up') 


# Create a TCP/IP socket to listen on 
print ('INFO: Creating TCP/IP Socket') 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# Prevent from 'ADDRESS ALREADY IN USE' upon restart 
print ('INFO: Housekeeping...') 
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

# Bind the socket to port 8081 on all interfaces 
server_address = ('localhost', 8081) 
print ('INFO: Binding and starting up on %s port %s' % server_address) 
server.bind(server_address) 
print ('INFO: Server bound') 

def send_welcome(cont): 
    cont.send('SERVER: Welcome'.encode('utf8')) 

# Listen for connectons for 5 seconds 
server.listen(5) 

# Connection is the SOCKET OBJECT for the connection 
# Client_address is the connected peer(the client) 
connection, client_address = server.accept() 
print ('INFO: Connection from', connection.getpeername()) 
print ('INFO: Sending welcome msg') 
send_welcome(connection) 
print() 

while SERVER_LOOP: 

    # Receive data 
    try: 
     data = connection.recv(10000) 

    # Unless there's an error 
    except OSError: 
     print (connection) 

    # Decode the data into usable lists 
    if type(data) != type(''): 
     data = data.decode() 

    # If we want to end the client stream but keep the server running  
    if data=='end' or data=='End' or data=='END': 
     print ('INFO: Closing connection with ',connection.getpeername()) 
     connection.shutdown(socket.SHUT_RD | socket.SHUT_WR) 
     print() 
     connection.close() 
     connection, client_address = server.accept() 
     print ('INFO: Connection from', connection.getpeername()) 
     print ('INFO: Sending welcome msg') 
     send_welcome(connection) 
     print() 

    # If we want to stop running the server 
    elif data=='end server' or data=='End server' or data=='End Server': 
     print() 
     print ('SERVER SHUT DOWN') 
     SERVER_LOOP = False 

    # Display when data is loaded back on the client side 
    else: 
      # gives feedback in server command line 
      data = json.loads(data) 
      owner['test'] = data 
      print ('CLIENT: %s' % data) 
      message = 'ping' 
      connection.send(('SERVER: %s' % message).encode('utf-8')) 
      print ('SERVER: %s' % message) 

而且客戶端代碼設置爲運行它(這一項上的Python 2.7運行)

# Client Program 
# Make sure the server is being run in Blender 

import socket 
import time 
import json 

print 'INFO: Creating Socket' 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

ip_addr = raw_input('IP: ') 
port_addr = raw_input('PORT: ') 

# Type 'localhost' in the IP field 
# Type '8081' in the PORT field 

print 'INFO: Connecting to server' 
s.settimeout(5) # Times out if 5 seconds without connecting to client 
s.connect((ip_addr, int(port_addr))) 

# Listen for welcome 
data = s.recv(10000) 
print data 
print '' 
while 1: 
    message = raw_input('CLIENT: ') 
    if message=='end' or message=='End' or message=='END': 
      print '' 
      print 'SHUTTING DOWN CLIENT, SERVER STILL RUNNING' 
      s.send(message) 
      break 
    elif message=='end server' or message=='End server' or message=='End Server': 
      print '' 
      print 'SHUTTING DOWN SERVER' 
      s.send(message) 
      break 
    else: 
      s.send(message) 
      data = s.recv(10000) 
      print data 

print 'INFO: Closing socket' 
s.close() 
print 'INFO: Quitting' 

現在,顯然這不會做旋轉;它只是一個測試腳本,以確保兩個作品之間的數據傳輸。它的確如此 - 在Blender的系統控制檯中,數據就像我想要的一樣顯示。然而,我在Blender中有一個標題爲「test」的字符串調試屬性,它應該顯示當前在客戶端輸入的數字,直到我關閉整個程序。

例如:

  • 我跑在攪拌機的服務器腳本
  • 我跑在IDLE
  • 客戶端腳本我的號碼在客戶端上輸入
  • 它們出現在系統控制檯在服務器端,但他們不出現在遊戲引擎
  • 我從客戶端關閉服務器
  • 現在,最後一個麻木呃我鍵入終於出現在服務器端

所以問題是,Blender運行我的腳本,然後在遊戲引擎完成後,但我希望他們同時運行。

讓我知道我的解釋是否沒有道理;如果需要,我可以提供下載到我的東西。

回答

1

我不知道這是否仍然是一個問題 - 你在2月發佈,現在是8月份,但我只是在尋找類似問題的答案。您的問題是Blender在腳本運行完成之前不會更新其框架。你的遊戲實際上停留在它所播放的第一幀,因爲它在該幀命中後立即啓動腳本,並且由於腳本的性質,它永遠不會結束。

目前,您使用server.listen(5)表示它偵聽五秒鐘,但該函數中的數字5表示積壓,而不是時間長度[source]。 socket.listen()會無限循環拖延你的遊戲(就我所知),就像無限循環一樣。

這可能不是你正在尋找的答案,但它絕對是一個答案。