【Motion Builder】配置c++插件开发环境
目录
- 准备环境
- 构建官方案例
- 另行构建
- 经验分享
- 附录
准备环境
- 安装Motion Builder 2024并破解
- 安装Qt 5.15.2
截止至2024年12月19日,Qt的在线安装器的默认页面是没有5.15.2版本的。你需要:在“选择组件”界面,选择“Archive”,点击“筛选”,重新加载数据库之后,你就可以看到旧版5.15.2了。
勾选Qt 5.15.2 的MSVC 2019 64-bit和Qt WebEngine。我个人比较断舍离,我觉得其它组件用不上,我就都消选了。点击下一步,直到安装完成。

- 安装cmake 3.17或更高的版本。
- 安装Visual Studio 2022 或更高版本,还必须安装“使用 C++ 进行桌面开发”Visual Studio 组件。
本节参考资料:MotionBuilder SDK 要求
构建官方案例
-
添加环境变量
变量名:QTDIR
变量值:{Qt5Config.cmake所在的目录}(举例:D:\software\Qt\5.15.2\msvc2019_64\lib\cmake\Qt5) -
修改MB给的cmake文件MotionBuilder 2024\OpenRealitySDK\cmake\OpenReality.cmake的第82行,把${QT_VERSION_MAJOR}改成5。
# find_package(Qt${QT_VERSION_MAJOR} ${QtVersion} REQUIRED COMPONENTS Core Gui Widgets Multimedia OpenGL OpenGLExtensions WebEngineWidgets Xml) find_package(Qt5 ${QtVersion} REQUIRED COMPONENTS Core Gui Widgets Multimedia OpenGL OpenGLExtensions WebEngineWidgets Xml) -
在
{你的MB安装目录}\MotionBuilder 2024\OpenRealitySDK下,输入cmake指令:cmake . -DCMAKE_BUILD_TYPE=Debug可选的build type还有RelWithDebInfo。
-
如果成功构建,打开OpenReality.sln。默认当前启动项目是ALL_BUILD,如果你直接编全部,大概率遇到各种警告编不过。建议按需编译:选择你需要的项目,右键点击”设为启动项目“,然后右键点击”生成“。
-
如果成功编译,那么编译出来的.lib会放在
D:\software\MotionBuilder 2024\bin\x64\plugins\Debug。
要想使用插件,你需要手动启动MB,点击顶部菜单栏的Settings>Preference>SDK>Add,选择上述目录,确定,Ok,重启MB即可使用。 -
快速启动(选读)
如果直接点击运行,是运行不了的,因为编译的结果是生成一个DLL而不是一个exe。我们需要把这个dll绑给MB。
右键当前项目,点击最下面的“属性”,选择“调试”,
填写“命令”为你本地的MB的exe文件。例如我的是"D:\software\MotionBuilder 2024\bin\x64\motionbuilder.exe"。这一步的作用是,在我们编译好之后,有.exe能直接启动。
填写“环境”为MOTIONBUILDER_PLUGIN_PATH=C:\Program Files\Autodesk\MotionBuilder 2023\bin\x64\plugins\Debug。这一步的作用是,让MB能找到插件在哪里。
如此启动之后,MB就能启动咱们编出来的样例插件,并且我们能在vs里打断点调试了。

另行构建
请先确保官方构建环节能够跑通。
我的基本思路:照搬官方构建的cmake文件,按需小改。
- 创建项目文件夹,以myplugin为例。
- 从OpenRealitySDK文件夹内拷贝以下3个内容到myplugin文件夹:

- 修改myplugin\CMakeLists.txt的第10行,把MOBU_ROOT设为你的MB根目录,例如我的是:
修改myplugin\CMakeLists.txt的第16行,子目录改为Src:# Mandatory path to MotionBuilder Root folder. set(MOBU_ROOT "D:/software/MotionBuilder 2024")add_subdirectory( Src ) - 在myplugin文件夹下,创建文件夹,命名为Src,用于放置源文件。在myplugin\Src\创建以下4个文件,拷贝我提供的内容(详见附录):
① CMakeLists.txt
② mytool_tool.h
③ mytool_tool.cpp
④ mytool_lib.cpp - 在myplugin文件夹下,cmake构建解决方案。创建脚本双击更方便。
Build.batmkdir build cd build cmake .. - 打开解决方案myplugin\build\myplugin.sln,把MyTool设为启动项目,运行启动,你会得到:

再次总结,构建好的文件目录应该是这样的,被选中的是必需:

之后就是圈地自嗨时间啦~!Enjoy!
经验分享
- 编译MB的插件,可能会把破解好的许可证弄坏,此时需要重新破解。祝大家心平气和
- 官方示例插件个数大约有80+,并不是每个插件都放在Tools列表里,而是藏在各种边边角角的下拉框。
当你找不到想学习的插件的入口时,请打开MotionBuilder 2024\OpenRealitySDK\Samples{插件的系列名}{插件的系列名}.txt,这个txt文本里面会标注这个系列下的每个插件是怎么使用的。
另外,每个插件的头文件,可能也会说明这个插件的功能作用。 - 官方文档是个好东西。
https://help.autodesk.com/view/MOBPRO/2024/ENU/?guid=GUID-0AEB6C9E-3A7D-4427-86DA-30E03D65E1C3
附录
① CMakeLists.txt
你可以从每个官方示例插件下找到cmake模板,例如OpenRealitySDK\Samples\boxes\box_template\CMakeLists.txt。不同的是,我对它进行了按需修改。
# 第1处修改: 设置我自己的项目名称
project(MyTool LANGUAGES CXX)# 第2处修改: 从罗列每个源文件,改成自动识别
file(GLOB HEADER_FILES ${PROJECT_SOURCE_DIR}/*.h)
file(GLOB SOURCE_FILE ${PROJECT_SOURCE_DIR}/*.cpp) # 注意,官方用的是cxx,我用的是cppsource_group(TREE ${CMAKE_SOURCE_DIR} FILES ${HEADER_FILES})
source_group(TREE ${CMAKE_SOURCE_DIR} FILES ${SOURCE_FILE})add_library(${PROJECT_NAME} SHARED${HEADER_FILES}${SOURCE_FILE}
)# 第3处修改:添加调试选项参数,这样就可以直接启动MB并绑定调试
set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DEBUGGER_COMMAND ${MOBU_ROOT}/bin/${BIN_PATH}/motionbuilder.exe)
set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "-console")
set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DEBUGGER_ENVIRONMENT "MOTIONBUILDER_PLUGIN_PATH=${MOBU_ROOT}/bin/${BIN_PATH}/plugins/$(Configuration)")target_compile_definitions(${PROJECT_NAME} PRIVATE FBXSDK_SHARED FBXSDK_NEW_API)
target_link_libraries(${PROJECT_NAME} PRIVATE fbsdk fbxsdk OpenGL::GL OpenGL::GLU)mobu_target_finalize(${PROJECT_NAME} plugins)
② mytool_tool.h
这是插件的UI入口类的头文件。
#ifndef __MYTOOL_H__
#define __MYTOOL_H__
// ===========================================================================
// Copyright 2017 Autodesk, Inc. All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk license
// agreement provided at the time of installation or download, or which
// otherwise accompanies this software in either electronic or hard copy form.
// ===========================================================================//--- SDK include
#include <fbsdk/fbsdk.h>//--- Registration define
#define ORTOOLTEMPLATE__CLASSNAME MyTool
#define ORTOOLTEMPLATE__CLASSSTR "MyTool"class FbxScene;/** Tool template.
*/
class MyTool : public FBTool
{//--- Tool declaration.FBToolDeclare( MyTool, FBTool );public://--- Construction/Destruction,virtual bool FBCreate(); //!< Creation function.virtual void FBDestroy(); //!< Destruction function.private:FBLabel mLabel;FBButton mButton;
};#endif
③ mytool_tool.cpp
这是插件的UI入口类的.cpp文件
// ===========================================================================
// Copyright 2017 Autodesk, Inc. All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk license
// agreement provided at the time of installation or download, or which
// otherwise accompanies this software in either electronic or hard copy form.
// ===========================================================================/** \file mytool_tool.cxx
*/
#include <fbsdk/fbsdk.h>//--- Class declaration
#include "mytool_tool.h"//--- Registration defines
#define ORTOOLTEMPLATE__CLASS ORTOOLTEMPLATE__CLASSNAME
#define ORTOOLTEMPLATE__LABEL "MyTool"
#define ORTOOLTEMPLATE__DESC "MAY - Tool Description"//--- Implementation and registration
FBToolImplementation( ORTOOLTEMPLATE__CLASS );
FBRegisterTool ( ORTOOLTEMPLATE__CLASS,ORTOOLTEMPLATE__LABEL,ORTOOLTEMPLATE__DESC,FB_DEFAULT_SDK_ICON ); // Icon filename (default=Open Reality icon)using namespace FBXSDK_NAMESPACE;/************************************************* Constructor.************************************************/
bool MyTool::FBCreate()
{// Tool optionsStartSize[0] = 800;StartSize[1] = 500;int lB = 10;//int lS = 4;int lW = 200;int lH = 18;// Configure layoutAddRegion("Label", "Label",lB, kFBAttachLeft, "", 1.0,lB, kFBAttachTop, "", 1.0,lW, kFBAttachNone, "", 1.0,lH, kFBAttachNone, "", 1.0);SetControl("Label", mLabel);mLabel.Caption = "Label";AddRegion("Button", "Button",lB, kFBAttachLeft, "", 1.0,30, kFBAttachTop, "", 1.0,lW, kFBAttachNone, "", 1.0,lH, kFBAttachNone, "", 1.0);SetControl("Button", mButton);mButton.Caption = "Button";return true;
}/************************************************* Destruction function.************************************************/
void MyTool::FBDestroy()
{}
④ mytool_lib.cpp
这是dll文件的注册信息。每个MB插件都是一个绑给MB的dll。
// ===========================================================================
// Copyright 2017 Autodesk, Inc. All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk license
// agreement provided at the time of installation or download, or which
// otherwise accompanies this software in either electronic or hard copy form.
// ===========================================================================/** \file MyToolcxx
* Library declarations.
* Contains the basic routines to declare the DLL as a loadable
* library.
*///--- SDK include
#include <fbsdk/fbsdk.h>#ifdef KARCH_ENV_WIN#include <windows.h>
#endif//--- Library declaration.
FBLibraryDeclare(MyTool)
{FBLibraryRegister(MyTool);
}
FBLibraryDeclareEnd;/************************************************* Library functions.************************************************/
bool FBLibrary::LibInit() { return true; }
bool FBLibrary::LibOpen() { return true; }
bool FBLibrary::LibReady() { return true; }
bool FBLibrary::LibClose() { return true; }
bool FBLibrary::LibRelease() { return true; }相关文章:
【Motion Builder】配置c++插件开发环境
目录 准备环境构建官方案例另行构建经验分享附录 准备环境 安装Motion Builder 2024并破解安装Qt 5.15.2 截止至2024年12月19日,Qt的在线安装器的默认页面是没有5.15.2版本的。你需要:在“选择组件”界面,选择“Archive”,点击“…...
多线程访问FFmpegFrameGrabber.start方法阻塞问题
一、背景 项目集成网络摄像头实现直播功能需要用到ffmpeg处理rtmp视频流进行web端播放 通过网上资源找到大神的springboot项目实现了rtmp视频流转为http请求进行视频中转功能,其底层利用javacv的FFmpegFrameGrabber进行拉流、推流,进而实现了视频中转。 …...
MySQL使用记录
char和varchar varchar是可变长的,实际用多少它就占多少,和char不同,char规定多少它就会占多少 varchar的长度是字符个数,不管是数字、英文还是汉字,varchar(10)都可以存10个,而不会出现因为汉字占更多的字…...
【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
视觉里程计(Visual Odometry, VO)是通过处理图像序列,估计摄像头在时间上的相对位姿变化的技术。它是视觉SLAM的重要组成部分之一,主要通过提取图像中的信息(如特征点或直接像素强度)来实现相机运动估计。以…...
Python 数据结构揭秘:栈与队列
栈(Stack) 定义 栈是一种后进先出(Last In First Out, LIFO)的数据结构。它类似于一个容器,只能在一端进行插入和删除操作。栈有两个主要的操作:push(入栈)和 pop(出栈…...
常见的框架漏洞
1.Thinkphp Thinkphp5x远程命令执行及getshell 搭建靶场 cd vulhub/thinkphp/5-rce docker-compose up -d 首页 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多&…...
在C++中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序;使用python的方案
在C中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序是相当复杂的,因为C本身并不直接提供高级的GUI自动化功能。通常,这样的任务会使用Windows API(如User32.dll中的函数)或者一些第三方库(如UIAutomati…...
《Vue3实战教程》26:Vue3Transition
如果您有疑问,请观看视频教程《Vue3实战教程》...
【架构设计(一)】常见的Java架构模式
常见的 Java 架构模式解析 在 Java 开发领域,选择合适的架构模式对于构建高效、可维护且能满足业务需求的软件系统至关重要。本文将深入探讨几种常见的 Java架构模式,包括单体架构与微服务架构、分层架构与微服务架构的对比,以及事件驱动架构…...
自定义有序Map
package cn.ziqirj.common.utils;import lombok.Getter; import lombok.Setter;import java.util.ArrayList; import java.util.List;/*** 模拟Map集合,key不可重复,按插入顺序排序* author zhangji** param <T>*/ public class CustomOrderlyMap&…...
Jenkins(持续集成与自动化部署)
Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具。 官网:https://www.jenkins.io/ GitLab安装使用 安装前提:内存至少需要4G 官方网站:https://about.gitlab.com/ 安装文档:https://docs.gitlab.c…...
redis7基础篇2 redis的哨兵模式2
目录 一 哨兵模式 1.1 redis的哨兵模式作用 1.2 redis的哨兵模式架构 1.3 redis的哨兵模式参数说明 二 redis的哨兵模式搭建 2.1 redis的主从复制模式 2.2 redis的sentinel配置文件 2.3 redis的实例节点和sentinel节点启动 3.3 redis的哨兵模式原理 3.3.1 redis的哨兵…...
windows终端conda activate命令行不显示环境名
问题: 始终不显示环境名 解决 首先需要配置conda的环境变量 确保conda --version能显示版本 然后对cmd进行初始化,如果用的是vscode中的终端,那需要对powershell进行初始化 Windows CMD conda init cmd.exeWindows PowerShell conda …...
SpringBoot 2.6 集成es 7.17
引言 在现代应用开发中,Elasticsearch作为一个强大的搜索引擎和分析引擎,已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一,其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在S…...
加固服务器有什么用?
为什么越来越多的企业和个人都在加固他们的服务器?加固服务器不仅可以保护数据安全,还能提升整体系统的稳定性和可靠性。下面是聚名网的一些介绍。 加固服务器的首要目的就是提高安全性。随着网络攻击手段的不断演变,黑客和恶意软件的威胁也…...
Personal APP
1、Matlab 2023b https://www.bilibili.com/opus/887246540317392920 https://blog.csdn.net/qq_25719943/article/details/138096918 https://www.jokerdown.com/22886.html 2、 3、...
探索最新的编程技术趋势:AI 编程助手和未来的编程方式
随着技术的飞速发展,编程技术领域在近年来经历了深刻的变革。从人工智能到低代码开发工具,新的技术趋势不断涌现,不仅大幅提高了开发效率,也重新定义了开发者的角色和工作方式。本篇博客将探讨几项当前最值得关注的编程技术&#…...
Android:文件管理:打开文件意图
三步走: 一、先在AndroidManifest.xml声明provider: <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…...
从纯虚类到普通类:提升C++ ABI兼容性的策略
在C编程中,纯虚类(也被称为抽象类)通常用于定义接口,而普通类则包含具体的实现。然而,在某些情况下,将纯虚类转换为普通类并提供默认实现,可以显著提升应用程序二进制接口(ABI&#…...
QT中如何限制 限制QLineEdit只能输入字母,或数字,或某个范围内数字等限制约束?
在 Qt 中,你可以通过多种方式来限制 QLineEdit 只能输入特定类型的字符,如字母、数字或某个范围内的数字。以下是一些常见的方法: 1. 使用输入验证器(QIntValidator, QDoubleValidator, QRegExpValidator) Qt 提供了…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
