背景

有需求 - 沉浸式虚拟环境行为数据捕获方案。目标:windows下,监听所有指定的窗口中鼠标和键盘的控件动作,并按一定的格式转成json存放下来,作为对视频动作执行行为的标注文件。


本方案旨在构建一个多模态交互行为数据库,需从动态三维虚拟世界中采集高质量的行为-环境对应数据。( 推测作为3D世界模型训练的样本来训练3D模型 )数据源应选自具有丰富交互可能性的虚拟平台,具体要求如下:

环境多样性原则

虚拟场景需覆盖多种生态与建筑类型,包括但不限于都市景观、自然地貌、人工建筑群等。每个录制片段应展现独特的环境特征,避免同类场景的重复出现。单一环境内的滞留时间过长或重复采集将被视为无效数据。

交互行为丰富性

必须捕捉虚拟角色与环境的动态互动,例如物体操纵、载具使用、机关触发等行为。单纯的角色移动或静态停留不构成奏效交互,需排除此类低效数据片段。

操控精准同步

完整记录所有输入设备信号(如键鼠操作轨迹),并确保每个管理指令与对应视频帧的时间偏差小于100毫秒。建立精确的时间戳映射机制,保证行为与视觉数据的严格对齐。

视觉纯净度标准

最大程度消除界面元素对场景的遮挡,包括HUD组件、提示信息等非场景内容。有效画面区域(去除界面遮挡后)需保持原始分辨率70%以上的可视面积。界面元素应最小化呈现,确保场景视觉主体突出。

体验自然性约束

保持虚拟世界的物理合理性,避免过度拥挤的实体分布和夸张的特效呈现。交互规模应控制在合理范围内,确保行为数据的真实性和可分析性。

视觉连续性要求

视角变换需保持平滑自然,禁止出现剧烈视角跳跃或抖动式运镜。摄像机运动应符合人体工学规律。

内容筛选规范

排除预渲染动画序列及二维交互程序(如棋牌类应用)。优先选择具有三维空间交互特性的虚拟环境。

光照视觉条件

确保场景光照充足,可见度良好。避免昏暗环境(如夜视场景、地下空间等)影响行为识别精度。

资源选取范围

参考主流数字分发平台的历史及当前热门交互体验(如Steam平台Top500现时热门及Top2000历史经典内容),确保样本来源的多样性和代表性。

:本方案侧重于构建具有时空连续性的行为-环境对应数据集,所有采集内容需满足机器学习对材料质量的一致性要求。

调研

用深度强化学习去遍历,基于python记录。找到类 Top 500 & Top 2000 中的 3D 类游戏,反映客观世界规律的游戏。就是Steam平台 Top500 现时热门及 Top2000 历史经典内容,我首先想到的

基于深度强化学习平台找可用3D游戏

在这里插入图片描述

针对以下4个开源平台进行可用游戏调研:
Unity ML-Agents
DeepMind Lab
OpenAI Universe
OpenAI-Unity

请注意,真正意义上图形顶尖的商业3A游戏大作,由于严格的版权保护,通常不会免费开放用于AI训练。目前AI训练领域的主力军是专门为研究设计的开源仿真平台(如上文所列)以及部分拥护模组或献出专门接口的独立游戏。在选择时,请务必仔细阅读其许可协议,确认允许用于非商业或研究性质的AI训练。

一、Unity ML-Agents

第一印象,是一些小游戏,甚至只是用于实验性的东西。因此可能不适合。

二、DeepMind Lab

三、OpenAI Universe

四、OpenAI-Unity

成功。就是另外,本次调研的目的是技术拉通,跟强化学习其实暂时无关,只需要我的python能够提取键盘鼠标的处理,构建为对应json文件即


游戏安装与python测试

一、steam登录,并下载、安装、启动游戏

在这里插入图片描述
在这里插入图片描述
我现在想要一个没有夜晚的游戏,因为电脑支持度不行,显示太垃圾。

代码

运行代码,给出选择监控的窗口。(再加上监控该窗口是否活跃状态,就可过滤掉那些非此窗口的处理,不过暂没达成,实际上也并不难)

import json
import time
import threading
import cv2
import numpy as np
import pyautogui
from pynput import keyboard, mouse
import win32gui
import win32process
import psutil
from datetime import datetime
from collections import deque
import os
import sys
class GameRecordingSystem:
    def __init__(self, game_window_title=None, output_dir="recordings"):
        """
        游戏录屏与输入记录一体化系统
        Args:
            game_window_title: 游戏窗口标题
            output_dir: 输出目录
        """
        self.game_window_title = game_window_title
        self.output_dir = output_dir
        self.is_recording = False
        self.is_game_active = False
        # 创建输出目录
        os.makedirs(output_dir, exist_ok=True)
        # 生成会话ID和时间戳
        self.session_id = datetime.now().strftime("%Y%m%d_%H%M%S")
        self.video_name = f"game_video_{self.session_id}"
        # 文件路径
        self.video_file = os.path.join(output_dir, f"{self.video_name}.mp4")
        self.input_file = os.path.join(output_dir, f"game_inputs_{self.session_id}.json")
        self.manual_file = os.path.join(output_dir, f"operation_manual_{self.session_id}.json")
        # 初始化数据结构(符合文档1格式)
        self.session_data = {
            "game_metadata": {
                "game_title": game_window_title or "Unknown Game",
                "session_id": self.session_id,
                "video_name": self.video_name,
                "start_time": None,
                "duration_seconds": 0,
                "video_file": self.video_file,
                "input_file": self.input_file
            },
            "movement_events": [],
            "view_events": [],
            "action_events": []
        }
        # 视频录制参数(符合文档1质量要求)
        self.fps = 30  # ≥24 fps
        self.resolution = (2560, 1440)  # ≥2560x1440
        self.video_writer = None
        # 输入记录状态
        self.event_buffer = deque(maxlen=1000)
        self.buffer_lock = threading.Lock()
        self.active_movement_keys = set()
        self.active_view_keys = set()
        self.current_movement = "Neutral"
        self.current_view = "Neutral"
        self.movement_start_time = None
        self.view_start_time = None
        # 键位映射
        self.movement_key_map = {'w': 'W', 's': 'B', 'a': 'L', 'd': 'R'}
        self.vi