【Motion Builder】配置c++插件开发环境

news2025/1/7 13:18:42

目录

    • 准备环境
    • 构建官方案例
    • 另行构建
    • 经验分享
    • 附录

准备环境

  1. 安装Motion Builder 2024并破解
  2. 安装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。我个人比较断舍离,我觉得其它组件用不上,我就都消选了。点击下一步,直到安装完成。
    在这里插入图片描述
  3. 安装cmake 3.17或更高的版本。
  4. 安装Visual Studio 2022 或更高版本,还必须安装“使用 C++ 进行桌面开发”Visual Studio 组件。

本节参考资料:MotionBuilder SDK 要求

构建官方案例

  1. 添加环境变量
    变量名:QTDIR
    变量值:{Qt5Config.cmake所在的目录} (举例:D:\software\Qt\5.15.2\msvc2019_64\lib\cmake\Qt5)

  2. 修改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)
    
  3. {你的MB安装目录}\MotionBuilder 2024\OpenRealitySDK下,输入cmake指令:

    cmake . -DCMAKE_BUILD_TYPE=Debug
    

    可选的build type还有RelWithDebInfo。

  4. 如果成功构建,打开OpenReality.sln。默认当前启动项目是ALL_BUILD,如果你直接编全部,大概率遇到各种警告编不过。建议按需编译:选择你需要的项目,右键点击”设为启动项目“,然后右键点击”生成“。

  5. 如果成功编译,那么编译出来的.lib会放在D:\software\MotionBuilder 2024\bin\x64\plugins\Debug
    要想使用插件,你需要手动启动MB,点击顶部菜单栏的Settings>Preference>SDK>Add,选择上述目录,确定,Ok,重启MB即可使用。

  6. 快速启动(选读)
    如果直接点击运行,是运行不了的,因为编译的结果是生成一个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文件,按需小改。

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

再次总结,构建好的文件目录应该是这样的,被选中的是必需:
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
之后就是圈地自嗨时间啦~!Enjoy!

经验分享

  1. 编译MB的插件,可能会把破解好的许可证弄坏,此时需要重新破解。祝大家心平气和
  2. 官方示例插件个数大约有80+,并不是每个插件都放在Tools列表里,而是藏在各种边边角角的下拉框。
    当你找不到想学习的插件的入口时,请打开MotionBuilder 2024\OpenRealitySDK\Samples{插件的系列名}{插件的系列名}.txt,这个txt文本里面会标注这个系列下的每个插件是怎么使用的。
    另外,每个插件的头文件,可能也会说明这个插件的功能作用。
  3. 官方文档是个好东西。
    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,我用的是cpp

source_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 options
	StartSize[0] = 800;
	StartSize[1] = 500;

	int lB = 10;
	//int lS = 4;
	int lW = 200;
	int lH = 18;

	// Configure layout
	AddRegion("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; }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大学生入学审核系统的设计与实现(源码+数据库+文档)

亲测完美运行带论文&#xff1a;文末获取源码 文章目录 项目简介&#xff08;论文摘要&#xff09;运行视频包含的文件列表&#xff08;含论文&#xff09;后台运行截图 项目简介&#xff08;论文摘要&#xff09; 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理…

使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享

作者&#xff1a;Hello&#xff0c;Panda 大家晚上好&#xff0c;熊猫君又来了。 今天要分享的是一个简单的MIPI到LVDS&#xff08;DVP&#xff09;接口转换的案例。目的就是要把低成本FPGA的应用潜力充分利用起来。 一、应用背景 这个案例的应用背景是&#xff1a;现在还在…

单片机-独立按键矩阵按键实验

1、按键介绍 按键管脚两端距离长的表示默认是导通状态&#xff0c;距离短的默认是断开状态&#xff0c; 如果按键按下&#xff0c;初始导通状态变为断开&#xff0c;初始断开状态变为导通 我们开发板是采用软件消抖&#xff0c;一般来说一个简单的按键消抖就是先读取按键的状…

供应链系统设计-供应链中台系统设计(七)- 商品中心设计篇

概述 上篇文章我们大致讲了一些商品中心相关的概念&#xff0c;例如&#xff1a;SPU、SKU、Item等等&#xff0c;在这里我们来简单的回顾一下&#xff1a; 商品概念的分层与定义&#xff1a; SPU&#xff08;Standard Product Unit&#xff09;&#xff1a;代表产品系列或产品…

RAG(Retrieval-Augmented Generation,检索增强生成)流程

目录 一、知识文档的准备二、OCR转换三、分词处理四、创建向量数据库五、初始化语言聊天模型1.prompt2.检索链3.对话 完整代码 知识文档的准备&#xff1a;首先需要准备知识文档&#xff0c;这些文档可以是多种格式&#xff0c;如Word、TXT、PDF等。使用文档加载器或多模态模型…

mysql自定义安装

1、下载安装包 我是在windows上安装&#xff0c;所以选择“Mysql Installer for Windows” 2、安装mysql 双击“mysql-installer-community-8.0.40.0.msi”&#xff0c;开始启动安装 这里选择安装项&#xff0c;这里只选择了两项。workbench是图形化管理工具&#xff0c;比较吃…

Innodisk iSMART V6使用说明_SSD还能用多久?已经读写了多少次数?……

Innodisk iSMART是一款SSD健康数据读取软件。它能轻松获取大部分SSD内部寄存器中的健康数据&#xff0c;并以简洁的图形界面展示给用户。在程序界面的顶部&#xff0c;是页面标签&#xff0c;点击页面标签就能切换到相应的页面。页面标签的下面是磁盘选择栏。点击磁盘编号&…

JAVA:利用 Redis 实现每周热评的技术指南

1、简述 在现代应用中&#xff0c;尤其是社交媒体和内容平台&#xff0c;展示热门评论是常见的功能。我们可以通过 Redis 的高性能和丰富的数据结构&#xff0c;轻松实现每周热评功能。本文将详细介绍如何利用 Redis 实现每周热评&#xff0c;并列出完整的实现代码。 2、需求分…

LSP介绍并实现语言服务

首发于Enaium的个人博客 LSP (Language Server Protocol) 介绍 前段时间我为Jimmer DTO实现了一个 LSP 的语言服务&#xff0c;这是我第一次实现 LSP&#xff0c;所以在这里我分享一下我实现LSP的经验。 首先来看一下效果&#xff0c;图片太多&#xff0c;我就放一部分&#…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露&#xff1a;理解大型语言模型的参数量级 关键词&#xff1a; #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日&#xff0c;微软在一篇医学相关论文中意外泄露了OpenAI及Claud…

一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理

文章目录 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理1.TCP建立连接需要3次握手1.1 先讲个你兄弟的故事1.2 TCP 3次握手1.2 TCP 3次握手8件事1.3 TCP握手能不能是两次 2. TCP 断开连接要4次挥手2.1 还回到你兄弟的故事上2.2 TCP 4次挥手2.2 TCP4次挥手4件事2…

解决npm报错:sill idealTree buildDeps

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 报错信息 使用 npm 安装依赖时报错&#xff1a;sill idealTree buildDeps 解决方案 请按照以下步骤进行相关操作&#xff1a; 1、删除 C:\Users{账户}\ 文件夹中的 .npm…

Apache Celeborn 在B站的生产实践

背景介绍 Shuffle 演进 随着B站业务的飞速发展,数据规模呈指数级增长,计算集群也逐步从单机房扩展到多机房部署模式。多个业务线依托大数据平台驱动核心业务,大数据系统的高效性与稳定性成为公司业务发展的重要基石。如图1,目前在大数据基础架构下,我们主要采用 Spark、Fl…

SAP系统中的标准价、移动平均价是什么?有何区别?物料分类账的优点

文章目录 前言一、SAP系统中的价格控制二、移动平均价、标准价是什么&#xff1f;三、S价&#xff08;标准价&#xff09;的优势四、S价&#xff08;标准价&#xff09;的劣势五、V价&#xff08;移动平均价&#xff09;的优势六、V价&#xff08;移动平均价&#xff09;的劣势…

我的Java-Web进阶--SpringMVC

1.三层架构与MVC模式 三层架构 MVC模式 2.SpringMVC执行流程 3.SpringMVC的基本使用方法 1. 配置 1.1 Maven依赖 首先&#xff0c;在pom.xml文件中添加Spring MVC的依赖&#xff1a; <dependencies><!-- Spring MVC --><dependency><groupId>org.…

让css设置的更具有合理性

目录 一、合理性设置宽高 二、避免重叠情况&#xff0c;不要只设置最大宽 三、优先使用弹性布局特性 四、单词、数字换行处理 五、其他编码建议 平常写css时&#xff0c;除了遵循一些 顺序、简化、命名上的规范&#xff0c;让css具有合理性也是重要的一环。 最近的需求场…

【C++】深入理解C语言中的特殊字符处理与问题分析优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目&#xff1a;B2090 年龄与疾病输入格式输出格式输入输出样例 &#x1f4af;初始代码分析与问题排查问题点分析 &#x1f4af;修正后的代码与优化修正与优化要点 &#…

面试题解,JVM中的“类加载”剖析

一、JVM类加载机制说一下 其中&#xff0c;从加载到初始化就是我们的类加载阶段&#xff0c;我们逐一来分析 加载 “加载 loading”是整个类加载&#xff08;class loading&#xff09;过程的一个阶段&#xff0c;加载阶段JVM需要完成以下 3 件事情&#xff1a; 1&#xff0…

vue路由模式面试题

vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…

构建一个rust生产应用读书笔记7-确认邮件3

设计架构思路 从前面的学习过程中&#xff0c;我们从单一文件测试套件发展到模块化测试套件&#xff0c;并构建了一套强大的辅助工具&#xff0c;这是一个非常重要的进展。个人认为测试代码和应用代码一样&#xff0c;是一个持续进化的过程。随着项目的不断成长&#xff0c;测…