gpt4 book ai didi

python - 在 Blender 中无线读取数据时运行游戏引擎

转载 作者:太空宇宙 更新时间:2023-11-03 19:05:40 25 4
gpt4 key购买 nike

我有一个 Blender 代码,它从 csv 文件中获取数据集,并使用它们在游戏引擎中旋转机器人 ARM 和人体模型。这段代码工作正常,但现在我想通过无线连接将数据发送到 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”的字符串调试属性,它应该显示刚刚在客户端中输入的当前数字,直到我关闭整个程序。

例如:

  • 我在 Blender 中运行服务器脚本
  • 我在 IDLE 中运行客户端脚本
  • 我在客户端输入数字
  • 它们出现在服务器端的系统控制台中,但不会出现在游戏引擎中
  • 我从客户端关闭服务器
  • 现在,我最后输入的数字终于出现在服务器端

所以问题是 Blender 运行我的脚本,然后在完成后运行游戏引擎,但我希望它们同时运行。

如果我的解释没有意义,请告诉我;如果需要,我可以提供我的资料的下载。

最佳答案

我不知道这是否仍然是一个问题 - 您在二月份发布,现在是八月份,但我只是在寻找类似问题的答案。您的问题是,在脚本运行完毕之前,Blender 不会更新其框架。您的游戏实际上卡在它播放的第一帧上,因为一旦该帧到达,它就会启动脚本,并且由于脚本的性质,它永远不会结束。

目前,您使用 server.listen(5) 表示它监听五秒,但该函数中的数字 5 指的是积压而不是时间长度 [source] 。 socket.listen() 将无限期地停止你的游戏(据我所知),就像无限循环一样。

这可能不是您正在寻找的答案,但这绝对是一个答案。

关于python - 在 Blender 中无线读取数据时运行游戏引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com