TiXL FreeDInput 算子详解:基于 UDP 的 FreeD 摄像机跟踪数据接收与虚拟制片集成
TiXL FreeDInput 算子详解基于 UDP 的 FreeD 摄像机跟踪数据接收与虚拟制片集成【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3FreeDInput 是 TiXLtooll3开源实时动态图形软件中 Lib.io.freed 命名空间下负责接收FreeD 摄像机跟踪数据的核心算子它通过 UDP 监听端口解析标准的 29 字节 FreeD 数据包并把每台摄像机的旋转、位置、变焦、聚焦等信息实时输出为 GPU 缓冲、字典与单值输出供虚拟制片、增强现实与广电制播场景使用。读完本文你将掌握 FreeDInput 的全部输入参数与输出语义、底层数据包解析原理24 位大端整数、校验和、缩放比例并能在 TiXL 中完成与 Unreal Engine、Vizrt、Aximmetry 等系统的实时联调。背景FreeD 协议与虚拟制片中的摄像机跟踪FreeD 是一种轻量级 UDP 协议广泛用于将摄像机云台跟踪数据Pan/Tilt/Roll、X/Y/Z 位置、镜头 Zoom/Focus 编码值从跟踪系统实时传输给渲染引擎或合成系统。在虚拟制片Virtual Production、增强现实AR和广电制播流程中虚拟摄像机必须与物理摄像机保持完全同步——这正是 FreeDInput 的用武之地Unreal Engine / Vizrt / Aximmetry等系统通常作为 FreeD 数据包发送端或接收端TiXL 通过 FreeDInput 以同等身份接入这条数据链路把跟踪数据驱动场景中的虚拟摄像机、匹配前景与背景画面配合同一命名空间下的 FreeDOutput发送端可以在 TiXL 内部完成接收—处理—再发送的完整闭环。该算子定义于 Operators/Lib/Symbols/io/freed/FreeDInput.cs与其配套的FreeDInput.t3/FreeDInput.t3ui符号与界面文件位于同一目录文档由算子库自动生成。输入参数FreeDInput 共提供 5 个输入参数覆盖了 UDP 监听所需的全部关键设置名称相关性与类型说明默认值与源码依据ListenBoolean启用后打开 UDP 套接字并开始监听禁用则关闭连接默认false。每次更新时比较新旧状态发生变化才执行启停见 FreeDInput.csLocalIpAddressString监听所用的本机网卡 IP0.0.0.0 (Any)表示监听所有可用网卡通常直接使用该值默认0.0.0.0 (Any)。该输入是一个下拉框ICustomDropdownHolder自动枚举本机所有 IPv4 地址见 FreeDInput.csPortInt32监听的 UDP 端口必须与发送方广播的目标端口一致默认6000FreeDInput.csCameraIdInt32选择输出到单摄像机输出CameraPos、CameraRot 等的特定摄像机 ID设为-1时自动选择 ID 最小的摄像机默认-1见 FreeDInput.csPrintToLogBoolean启用后把详细活动与错误信息打印到 T3 日志控制台便于调试默认false参数源码解读设置变更检测算子每帧比较Listen、LocalIpAddress、Port的当前值与上次状态只有发生变化时才关闭旧套接字并重新监听避免频繁重建 UDP 连接造成丢包或抖动FreeDInput.cs。网卡下拉框GetOptionsForInput会枚举所有状态为 Up 且非回环的网卡的 IPv4 单播地址并在列表头部固定提供0.0.0.0 (Any)与127.0.0.1选择后通过SetTypedInputValue写回输入FreeDInput.cs。地址解析兜底监听循环中若 IP 无法解析或为空则回退到IPAddress.Any监听所有网卡行为与0.0.0.0 (Any)一致FreeDInput.cs。输出参数FreeDInput 提供 8 个输出分为全部摄像机批量与单摄像机精选两组名称类型说明CamerasAsBufferT3.Core.DataTypes.BufferWithViews所有已跟踪摄像机的 GPU 结构化缓冲每个元素一个Point可直接送入渲染管线CameraDataAsDictT3.Core.DataTypes.Dict1[System.Single]以路径为键的字典涵盖每台摄像机的 Pan/Tilt/Roll、PosX/PosY/PosZ、Zoom、Focus、UserIsListeningSystem.Boolean当前是否正在监听监听线程处于 Running 状态CameraPosSystem.Numerics.Vector3选定摄像机的世界位置米CameraRotSystem.Numerics.Vector3选定摄像机的旋转度ZoomSystem.Single选定摄像机的变焦编码值FocusSystem.Single选定摄像机的聚焦编码值UserSystem.Single选定摄像机的自定义用户数据所有输出均标记为DirtyFlagTrigger.Animated并由同一个Update方法驱动FreeDInput.cs。批量输出CamerasAsBuffer 与 CameraDataAsDict当至少收到一台摄像机的数据后算子会按摄像机 ID 升序遍历内部字典生成两个并行视图GPU 缓冲每个摄像机映射为一个 Point 结构体64 字节Stride 16 * 4其中Position保存摄像机位置Orientation保存由yaw/pitch/roll度转弧度经Quaternion.CreateFromYawPitchRoll构造的四元数Scale编码为(Focus, Zoom, User)F1存放摄像机 IDColor为Vector4.OneFreeDInput.cs。字典输出键形如/{id}/Pan、/{id}/Tilt、/{id}/Roll、/{id}/PosX、/{id}/PosY、/{id}/PosZ、/{id}/Zoom、/{id}/Focus、/{id}/User方便用字符串路径在算子图中取任意一台摄像机的任意通道。缓冲通过ResourceManager.SetupStructuredBuffer创建并同时生成 SRV 与 UAVFreeDInput.cs缓冲区尺寸不变时仅用UpdateSubresource增量上传避免每帧重新分配 GPU 资源。单摄像机输出CameraId指定要读取的摄像机大于等于 0 时按该 ID 查找为-1时自动选择当前已跟踪摄像机中 ID 最小的那台。找到后其位置、旋转、变焦、聚焦与用户数据分别写入CameraPos、CameraRot、Zoom、Focus、User五个输出FreeDInput.cs。FreeD 数据包解析原理FreeDInput 内置了完整的 FreeD 协议解析实现这对理解数据精度与排查联调问题至关重要。包格式29 字节解析入口ParseFreeDDataPacket定义了如下布局FreeDInput.cs偏移长度字段解析方式01协议标识符必须为0xD1否则丢弃该包11摄像机 IDbyte作为字典键2 / 5 / 8各 3Pan / Tilt / Roll24 位有符号大端整数除以32768.0得到度11 / 14 / 17各 3PosX / PosY / PosZ24 位有符号大端整数除以64000.0得到米203Zoom24 位无符号大端整数233Focus24 位无符号大端整数262User16 位大端整数(data[26] 8) \| data[27]281校验和必须等于0x40 - Σ(前 28 字节) 0xFF否则丢弃关键实现细节校验和CalculateFreeDChecksum取前 28 字节求和再用0x40u - sum截断为单字节解析时若与末字节不符则整包丢弃有效防止错包污染跟踪数据FreeDInput.cs。24 位有符号数的符号扩展ReadInt24BigEndian将三个字节拼成 32 位整数若最高位0x80置位则或上0xFF000000完成符号扩展正确处理负角度与负坐标FreeDInput.cs。角度/距离缩放旋转原始值除以32768.0即得角度度位置原始值除以64000.0即得米。发送端 FreeDOutput.cs 使用完全相同的两个缩放常量做编码二者严格互逆。去重与覆盖同一摄像机 ID 的新包直接覆盖旧值_trackedValues[newData.CameraId] newData因此同一 ID 的跟踪数据天然最新值优先FreeDInput.cs。内部工作流从 UDP 数据报到 GPU 缓冲从网络字节流到可渲染数据FreeDInput 内部按如下流程工作后台监听线程启用Listen后StartListening启动一个Task.Run的后台任务创建UdpClient设置ReuseAddress套接字选项后Bind到目标 IP 与端口随后循环ReceiveAsyncFreeDInput.cs。队列缓冲收到的原始字节包压入ConcurrentQueuebyte[]FreeDInput.cs网络线程与主线程解耦避免阻塞渲染循环。主线程解析算子在每次求值更新时把队列中的包全部取出并解析写入以摄像机 ID 为键的ConcurrentDictionarybyte, FreeDCameraDataFreeDInput.cs。输出装配如上文所述生成字典输出、单摄像机输出与 GPU 结构化缓冲。状态报告算子实现 IStatusProvider通过状态栏向用户反馈监听中但未收到数据Listening, no camera data received yet.Notice正常跟踪Tracking N cameras.Success监听线程异常退出Listener failed: ...Error未启用监听Not listening.。实操指南在 TiXL 中接入 FreeD 跟踪源以下是以 FreeDInput 为核心的最小联调流程创建算子在算子库的Lib.io.freed分组中拖入FreeDInput。配置监听Listen设为trueLocalIpAddress保留0.0.0.0 (Any)监听所有网卡通常最省心若主机存在多网卡且需要指定可从此参数的下拉框中直接选择具体 IPv4 地址Port设置为与发送端一致的端口双方默认都是6000。确认数据进入观察算子状态栏应显示Tracking N cameras.若一直显示no camera data received检查发送端是否已启动、端口与目标 IP 是否正确。消费数据驱动虚拟摄像机把CameraPos、CameraRot、Zoom连接到对应算子的位置/旋转/参数输入批量渲染把CamerasAsBuffer直接接到点云/粒子类算子的输入逐通道取值用CameraDataAsDict的字符串键如/1/Pan在算子图中按路径读取任意通道。多摄像机发送端可同时发送多台摄像机的数据FreeDInput 会自动按 ID 归类用CameraId切换单摄像机输出的目标或用字典/缓冲输出批量处理全部摄像机。调试打开PrintToLogT3 日志控制台会输出监听绑定信息Bound to ip:port、解析摘要含 Zoom/Focus/User与队列长度等详细日志FreeDInput.cs。无发送端时的自测方法仓库中的 FreeDOutput 算子与 FreeDInput 使用相同的包格式、缩放常量与默认端口 6000。在没有外部跟踪设备时可以用 FreeDOutput 指向 FreeDInput 的监听地址发送测试包验证整条解析链路这也证明了两个算子可以在同一台机器上完成发送—接收闭环联调。常见问题与排查现象可能原因与处理状态栏一直显示no camera data received发送端未启动、端口不一致、或发送目标 IP 未指向本机确认双方端口一致监听失败Listener failed端口被占用或 IP 无效更换端口或改选下拉框中的具体网卡 IP单摄像机输出无数据检查CameraId是否为-1或对应的合法 ID发送端可能没有发送该 ID 的数据数据抖动/乱跳校验和不过的包已被丢弃确认发送端严格遵循 29 字节、0xD1标识与校验规则需要同时处理多台摄像机使用CamerasAsBuffer或CameraDataAsDict批量输出它们会覆盖所有已跟踪的摄像机 ID扩展阅读发送端算子FreeDOutput 与 FreeDOutput.cs命名空间总览Lib.io.freed README、Lib.ioGPU 缓冲元素定义PointPosition/Orientation/Scale/F1布局状态反馈接口IStatusProvider【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Claude Code Sub-agents 跑团队协作:Key 用 TaoToken

Claude Code Sub-agents 跑团队协作:Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 19:53:07 阅读更多 →
GAMIT从配置到出结果

GAMIT从配置到出结果

GAMIT从配置到出结果安装目录虚拟机配置VMwareWSL2启用WSL2下载Ubuntu18.04 LTS换源安装依赖项改编译器优先级将安装包导入虚拟机VMWareWSL2解压压缩包文件夹提升权限编译GAMIT修改Makefile.config修改GAMIT几个常量更新包添加环境变量基线解算数据准备rinex文件的准备工作大写…

2026/11/5 10:56:45 阅读更多 →
Pandoc RST 读取器中的替换文本(Substitution References)解析机制与实战指南

Pandoc RST 读取器中的替换文本(Substitution References)解析机制与实战指南

文档开发工具CLI 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 点击查看 免费下载 导读 reStructuredText(reST)中的替换文本(substitution reference)允…

2026/10/31 1:57:47 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/10 23:32:01 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/10 23:32:03 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/11 2:31:33 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/10 16:14:15 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/10 12:51:50 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/10 23:32:10 阅读更多 →

日新闻

周新闻

月新闻