From b464052bacee02dbfec28cdafa711b09ffadc425 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Wed, 16 Aug 2023 16:55:46 +0800 Subject: [PATCH] vault backup: 2023-08-16 16:55:46 --- 01-Diary/周小结/2023.8.18工作进度汇报.md | 3 +- 06-DCC/Blender/Blender Python笔记.md | 122 +++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/01-Diary/周小结/2023.8.18工作进度汇报.md b/01-Diary/周小结/2023.8.18工作进度汇报.md index ce9017d..22e112c 100644 --- a/01-Diary/周小结/2023.8.18工作进度汇报.md +++ b/01-Diary/周小结/2023.8.18工作进度汇报.md @@ -1,2 +1,3 @@ ## AIMotionRender -1. UE服务化实现完成,目前可以通过WebSocket控制进行重定向并且生成fbx文件。 \ No newline at end of file +1. UE5动画重定向服务化实现完成,目前可以通过WebSocket控制进行重定向并且生成fbx文件。 +2. 尝试使用Pyside6库实现WebSocketServer来实现Blender动画重定向服务化,但因为Blender的动画重定向功能都由插件提供,而且效果不如UE5,所以放弃。 \ No newline at end of file diff --git a/06-DCC/Blender/Blender Python笔记.md b/06-DCC/Blender/Blender Python笔记.md index 5e4a5d1..0b302df 100644 --- a/06-DCC/Blender/Blender Python笔记.md +++ b/06-DCC/Blender/Blender Python笔记.md @@ -15,3 +15,125 @@ sys.path.insert(0, my_python_path) ```bash pip install PySide6-Addons ``` + +# WebSocketServer for Blender +https://github.com/KoltesDigital/websocket-server-for-blender + +## Pyside6实现 +TODO:添加多线程,防止退出。 +```python +# blender --background test.blend --python mytest.py -- example args 123 +import sys +import pathlib +# import pyside6 +my_python_path = "C:\Python311\Lib\site-packages" +sys.path.insert(0, my_python_path) + +import bpy +from PySide6.QtNetwork import QHostAddress +from PySide6.QtWebSockets import QWebSocket +from PySide6.QtWebSockets import QWebSocketServer + +class QRetargetWebsocketServer(QWebSocketServer): + def __init__(self): + super(QRetargetWebsocketServer, self).__init__("RetargetWebsocketServer", QWebSocketServer.NonSecureMode) + self.closed.connect(self.onClosed) + self.newConnection.connect(self.onNewConnection) + + def onClosed(): + print('connect closed!') + + def onNewConnection(self, context, event): + client: QWebSocket = self.nextPendingConnection() + client.textMessageReceived.connect(self.onTextReceived) + + def onTextReceived(self, text: str): + client: QWebSocket = self.sender() + + if text == "Retarget": + print("Retarget") + client.sendTextMessage("Retarget") + else: + print("text:", text) + +# 提取输出的命 +argv = sys.argv +print(argv) +# argv = argv[argv.index("--") + 1:] # get all args after "--" +# print(argv) # --> ['example', 'args', '123'] + +WebSocketServer = QRetargetWebsocketServer() +WebSocketServer.listen(QHostAddress.LocalHost,9091) + +``` + +# Http Server +```python +bl_info = { + "name": "My Awesome Server", + "blender": (2, 80, 0), + "category": "Object", +} + + +from http.server import BaseHTTPRequestHandler, HTTPServer +import threading +import bpy + +class MyServer(BaseHTTPRequestHandler): + def do_GET(self): + if self.path == '/test': + self.send_response(200) + self.send_header('Content-type','text/html') + self.end_headers() + message = "This is a test page2." + self.wfile.write(bytes(message, "utf8")) + else: + self.send_response(404) + self.send_header('Content-type','text/html') + self.end_headers() + message = "404 Not Found." + self.wfile.write(bytes(message, "utf8")) + return + +httpd = None +thread = None +thread2 = None + +def start_server(): + global httpd + + server_address = ('localhost', 8080) + # Server is not running, start it + httpd = HTTPServer(server_address, MyServer) + print("Server started") + httpd.serve_forever() + +def stop_server(): + global httpd + global thread + httpd.shutdown() + thread.join() + print("Server stopped") + +def stop_server_thread(): + global thread2 + thread2 = threading.Thread(target=stop_server) + thread2.start() + +def register(): + global thread + print("Hello World") + + # Start the server on a new thread + thread = threading.Thread(target=start_server) + thread.daemon = True + thread.start() + +def unregister(): + print("Goodbye World") + + stop_server_thread() + global thread2 + thread2.join() +``` \ No newline at end of file