以下是 MocapApi 技术文档
github https://github.com/pnmocap/MocapApi?tab=readme-ov-file
国内可以查找getcode
英文文档
https://mocap-api.noitom.com/mocap_api_en.html
概述
MocapApi 是 NeuronDataReader(以下简称 NDR)的下一代编程接口,设计目标为:
- 跨平台兼容(Win/Mac/Android/iOS/Linux)
- 跨引擎访问(Unity/Unreal)
- 无需用户手动更新
当前支持语言:C、C++、C#,支持 Windows、Unity 和 Unreal Engine。
MocapApi 接收来自 AxisStudio、Pnlab 等软件的 Socket 数据流。
命名规则与调用约定
命名规则
- 接口类型:命名格式为
IMCpxxx
(如IMCPApplication
) - 句柄类型:命名格式为
MCPXxxHandle_t
(如MCPApplicationHandle_t
) - 其他类型遵循匈牙利命名法。
语言差异
语言 | 头文件/模块 | 接口类型 | 句柄类型 |
---|---|---|---|
C++ | MocapApi.h |
IMCpxxx |
MCPXxxHandle_t |
C | MocapCApi.h |
MCPXxx_ProcTable 结构体 |
MCPXxxHandle_t |
C# | MocapApi.cs |
IMCpxxx |
无直接对应,通过接口访问 |
核心类型与功能
1. IMCPApplication & MCPApplicationHandle_t
表示与 Axis Studio 广播端口的连接,用于轮询数据和状态。
关键方法:
// 获取接口指针
MocapApi::IMCPApplication* mcpApplication = nullptr;
MocapApi::MCPGetGenericInterface(MocapApi::IMCPApplication_Version,
reinterpret_cast<void**>(&mcpApplication));
// 创建/销毁Application实体
MCPApplicationHandle_t appHandle;
mcpApplication->CreateApplication(&appHandle);
mcpApplication->DestroyApplication(appHandle);
2. IMCPAvatar & MCPAvatarHandle_t
对应 Axis Studio 中的 Avatar 模型,用于获取骨骼层级和关节数据。
关键方法:
// 获取根关节
MCPJointHandle_t rootJoint;
mcpAvatar->GetAvatarRootJoint(&rootJoint, avatarHandle);
// 通过名称获取关节
mcpAvatar->GetAvatarJointByName("LeftKnee", &jointHandle, avatarHandle);
3. IMCPJoint & MCPJointHandle_t
处理关节的本地变换数据(位置/旋转)。
关键方法:
// 获取欧拉角旋转
float rx, ry, rz;
mcpJoint->GetJointLocalRotaionByEuler(&rx, &ry, &rz, jointHandle);
// 获取子关节
MCPJointHandle_t childJoints[10];
uint32_t childCount = 10;
mcpJoint->GetJointChild(childJoints, &childCount, jointHandle);
4. 事件处理(PollApplicationNextEvent)
轮询来自 Axis Studio 的事件(如 Avatar 更新、错误等):
MCPEvent_t events[10];
uint32_t eventCount = 10;
mcpApplication->PollApplicationNextEvent(events, &eventCount, appHandle);
数据流逻辑
错误处理
- 函数调用错误:通过
EMCPError
返回(如Error_None
表示成功)。 - 运行时错误:通过事件机制通知(如
MCPEvent_Error
)。
附录:关键枚举类型
// BVH旋转顺序
enum EMCPBvhRotation {
BvhRotation_XYZ, BvhRotation_XZY, ..., BvhRotation_ZYX
};
// 坐标系设置
enum EMCPCoordSystem {
CoordSystem_RightHanded, // 右手系
CoordSystem_LeftHanded // 左手系
};
// 命令类型(如开始/结束捕捉)
enum EMCPCommand {
CommandStartCapture, CommandStopCapture, ...
};
注意事项
- 内存管理:通过
CreateXxx
创建的对象需手动调用DestroyXxx
释放。 - 实时性:建议在独立线程中轮询
PollApplicationNextEvent
。 - 坐标转换:可通过
IMCPRenderSettings
设置上/前向量和单位(米/厘米)。
如需具体代码示例或进一步功能说明,请提供应用场景细节!