Motionbuilder矩阵计算方式

2023-11-10

基本使用

对于类型为 FBModel 的对象,有 GetMatrix() SetMatrix() 方法来获取及设置其变换矩阵

GetMatrix(pMatrix: FBMatrix, pWhat = kModelTransformation, pGlobalInfo = True, pEvaluateInfo = None)		

pMatrix:
Matrix to fill with requested information.
pWhat
Type of information requested (default=transformation).
pGlobalInfo
true if it is GlobalInfo, false if Local (default=true).
pEvaluateInfo
EvaluateInfo, Take Display if none specified.

矩阵变换顺序(Matrix Transformation Order)

在Motionbuilder中,模型的全局平移、旋转和旋转矩阵都是单独计算的。这些矩阵计算遵循特定的顺序,如下所示,使用 M M M 后缀表示矩阵,使用 V V V 后缀表示向量。

全局旋转矩阵

计算局部旋转矩阵和全局旋转矩阵如下所示,矩阵是从右向左应用的。
R o t a t i o n D o F M = K R o t a t i o n M ⋅ J R o t a t i o n M ⋅ I R o t a t i o n M RotationDoFM=KRotationM\cdot JRotationM \cdot IRotationM RotationDoFM=KRotationMJRotationMIRotationM
见上式,其中 I R o t a t i o n M IRotationM IRotationM J R o t a t i o n M JRotationM JRotationM, K R o t a t i o n KRotation KRotation 描述的是围绕每个局部旋转轴的旋转量。例如如果模型的旋转循序为 Z Y X ZYX ZYX
那么 I R o t a t i o n M IRotationM IRotationM 表示 Z Z Z 轴的旋转量, J R o t a t i o n M JRotationM JRotationM 描述的是 Y Y Y 轴的旋转量, K R o t a t i o n KRotation KRotation 描述的是 Z Z Z 轴的旋转量。

L o c a l R o t a t i o n M = P r e R o t a t i o n M ⋅ R o t a t i o n D o F M ⋅ P o s t R o t a t i o n M − 1 LocalRotationM=PreRotationM \cdot RotationDoFM \cdot PostRotationM^{-1} LocalRotationM=PreRotationMRotationDoFMPostRotationM1
见上式, P o s t R o t a t i o n M − 1 PostRotationM^{-1} PostRotationM1 描述的是 P o s t R o t a t i o n M PostRotationM PostRotationM 的逆矩阵。
当你想要创建一个T-pose(每个局部旋转轴的值为0的骨骼)骨架时,Post Rotation是有用的。如果你改变了前后旋转,这将影响模型的子模型。要只影响模型的几何形状,可以更改FBModel.GeometricTranslation, FBModel.GeometricRotation 与 FBModel.GeometricScaling。

G l o b a l R o t a t i o n M = P a r e n t G l o b a l R o t a t i o n M ⋅ L o c a l R o t a t i o n M GlobalRotationM = ParentGlobalRotationM \cdot LocalRotationM GlobalRotationM=ParentGlobalRotationMLocalRotationM
见上式,当 P a r e n t G l o b a l R o t a t i o n M ParentGlobalRotationM ParentGlobalRotationM 矩阵是当前对象的父节点的 G l o b a l R o t a t i o n M GlobalRotationM GlobalRotationM。所得到的局部旋转矩阵( L o c a l R o t a t i o n M LocalRotationM LocalRotationM)稍后将用于全局缩放和位移矩阵的计算。

全局缩放矩阵

G l o b a l S c a l e V = P a r e n t G l o b a l S c a l e V ⋅ L o c a l S c a l e V (1.1) \tag{1.1}GlobalScaleV = ParentGlobalScaleV \cdot LocalScaleV GlobalScaleV=ParentGlobalScaleVLocalScaleV(1.1)
全局缩放矩阵表示为 G l o b a l S c a l e M GlobalScaleM GlobalScaleM ,其计算根据自身父级的比例继承类型而不同。
Local ( R r S s RrSs RrSs) 见式(1.1)表示局部缩放模式,在X、Y、Z轴上缩放父对象时,子对象也转换为与父对象保持成比例的距离。可以在不影响父对象的情况下缩放子对象。

G l o b a l S c a l e M = L o c a l R o t a t i o n M − 1 ⋅ P a r e n t G l o b a l S c a l e M ⋅ L o c a l R o t a t i o n M ⋅ L o c a l S c a l e M (1.2) \tag{1.2}GlobalScaleM=LocalRotationM^{-1}\cdot ParentGlobalScaleM \cdot LocalRotationM \cdot LocalScaleM GlobalScaleM=LocalRotationM1ParentGlobalScaleMLocalRotationMLocalScaleM(1.2)
Parent ( R S r s RSrs RSrs) 激活父缩放模式,见式(1.2),其计算依赖于上文定义的局部旋转矩阵 L o c a l R o t a t i o n M LocalRotationM LocalRotationM 如果在一个轴上缩放父对象,子对象会变形以保持它们的体积,同事拉伸到同一轴上的缩放。
G l o b a l S c a l e M = L o c a l R o t a t i o n M − 1 ⋅ P a r e n t G l o b a l S c a l e M ⋅ P a r e n t L o c a l S c a l e M − 1 ⋅ L o c a l R o t a t i o n M ⋅ L o c a l S c a l e M (1.3) \tag{1.3}GlobalScaleM = LocalRotationM^{-1}\cdot ParentGlobalScaleM \cdot ParentLocalScaleM^{-1} \cdot LocalRotationM \cdot LocalScaleM GlobalScaleM=LocalRotationM1ParentGlobalScaleMParentLocalScaleM1LocalRotationMLocalScaleM(1.3)
Scale Compensate (比例补偿)。见式(1.3)在这个模式下,子对象不从父对象继承缩放。当父对象被缩放时,子对象不会缩放,而是转换以保持模型之间的比例距离。

全局位移矩阵

S c a l e P i v o t T r a n s l a t i o n V = ( I − L o c a l S c a l e M ) ⋅ S c a l e P i v o t V + S c a l e P i v o t O f f s e t V ScalePivotTranslationV = (I - LocalScaleM) \cdot ScalePivotV + ScalePivotOffsetV ScalePivotTranslationV=(ILocalScaleM)ScalePivotV+ScalePivotOffsetV
其中 I I I为单位矩阵
S c a l e A n d R o t a t e P i v o t T r a n s l a t i o n V = ( L o c a l R o t a t i o n M ⋅ ( S c a l e P i v o t T r a n s l a t i o n V − R o t a t i o n P i v o t V ) ) + R o t a t i o n P i v o t V + R o t a t i o n P i v o t O f f s e t V ScaleAndRotatePivotTranslationV=(LocalRotationM \cdot (ScalePivotTranslationV - RotationPivotV))+RotationPivotV + RotationPivotOffset V ScaleAndRotatePivotTranslationV=(LocalRotationM(ScalePivotTranslationVRotationPivotV))+RotationPivotV+RotationPivotOffsetV

L o c a l T r a n s l a t i o n V = T r a n s l a t i o n D o F V + R o t a t i o n P i v o t T r a n s l a t i o n V LocalTranslationV = TranslationDoFV + RotationPivotTranslationV LocalTranslationV=TranslationDoFV+RotationPivotTranslationV
G l o b a l T r a n s l a t i o n V = P a r e n t G l o b a l T r a n s f o r m a t i o n M ⋅ L o c a l T r a n s l a t i o n V GlobalTranslationV = ParentGlobalTransformationM \cdot LocalTranslationV GlobalTranslationV=ParentGlobalTransformationMLocalTranslationV

全局变换矩阵

全局变换矩阵是全局位移、旋转及缩放矩阵的组合
G l o b a l T r a n s f o r m a t i o n M a t r i x = G l o b a l T r a n s l a t i o n M ⋅ G l o b a l R o t a t i o n M ⋅ G l o b a l S c a l e M GlobalTransformationMatrix = GlobalTranslationM \cdot GlobalRotationM \cdot GlobalScaleM GlobalTransformationMatrix=GlobalTranslationMGlobalRotationMGlobalScaleM

官方文档
FBModel 文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Motionbuilder矩阵计算方式 的相关文章

随机推荐

  • 解决node-sass: Command failed 问题

    从github 下载的vue 源码 yarn 安装报错 爬了下百度 试了好几种方法都没成功 最后ChatGPT帮我解决了 ChatGPT回答 一语命中 好用 node sass 是一个将 Sass 编译为 CSS 的 Node js 模块
  • 关于springboot使用定时器的几种方式

    1 Scheduled注解 Component public class SimpleSchedule private Integer time 0 定时器定义 设置执行时间 Scheduled cron 6 private void pr
  • maven -- 问题解决(二)解决“Could not calculate build plan”问题

    错误提示如下 eclipse maven Could not calculate build plan Failure to transfer org apache maven plugins maven surefire plugin p
  • disabled_button

    直接看题目 然后干他 这里说flag在按钮上 但是我们就是按不了这个flag 那直接看HTML呗 可以看到它这里有个搞鬼的东东 一搜 可以知道这个东西禁止让你输入 你不让我输入 我就给你删了呗 然后我们可以点flag 一点 flag就出来了
  • 关于漏洞"这个页面包含一个错误/警告信息,可能会导致敏感信息泄露"

    公司开发的产品 在用软件扫描漏洞时 扫出了这么一个漏洞 可以看出有漏洞的地方是登录页面 在登录中 主要逻辑如下 一些拒绝登录是通过抛异常 gt 然后捕获异常 gt 获取异常信息 gt 跳回到登录页面并展示错误信息 下面为代码示例 Requs
  • 如何获取 docker 容器(container)的 ip 地址

    1 进入容器内部后 lcc lcc docker exec it docker mysql bash root b3b1d61142df root b3b1d61142df cat etc hosts 127 0 0 1 localhost
  • Hive 是怎样保存元数据的

    保存元数据的方式有 内存数据库derby 本地mysql数据库 远程mysql数据库 本地的mysql数据库用的比较多 因为本地读写速度都比较快 内存数据库derby 安装小 但是数据存在内存 不稳定 mysql数据库 数据存储模式可以自己
  • React 中的元素、组件、实例和节点

    React 元素其实就是一个简单JavaScript对象 一个React 元素和界面上的一部分DOM对应 描述了这部分DOM的结构及渲染效果 一般我们通过JSX语法创建React 元素 React 元素可以分为两类 DOM类型的元素和组件类
  • Java常用API

    文章目录 1 API 1 1 API概述 帮助文档的使用 1 2 键盘录入字符串 2 String类 2 1 String概述 2 2 String类的构造方法 2 3 创建字符串对象的区别对比 2 4 字符串的比较 2 5 String方
  • Docker常用镜像命令

    帮助命令 查看docker版本 docker version 对docker信息的描述 docker info docker的帮助命令 docker help 详解 docker OPTIONS COMMAND docker的命令公式 镜像
  • Text to image论文精读MISE:多模态图像合成和编辑Multimodal Image Synthesis and Editing: A Survey

    由于信息在现实世界中以各种形式存在 多模态信息之间的有效交互和融合对于计算机视觉和深度学习研究中多模态数据的创建和感知起着关键作用 近期 OpenAI 发布的 DALLE 2 和谷歌发布的 Imagen 等实现了令人惊叹的文字到图像的生成效
  • 「经验分享」一款PCB电路板设计要经历哪些流程?

    一款PCB电路板设计主要包括明确产品需求 硬件系统设计 器件选型 PCB绘制 PCB生产打样 焊接调试等步骤 那么这些步骤都有哪些需要注意点呢 小编带你细品 一定要细品 一 明确需求 在一个硬件设计之初 首先要做的是明确产品的需求 这里主要
  • BMP文件格式详解(BMP file format)

    BMP文件格式 又称为Bitmap 位图 或是DIB Device Independent Device 设备无关位图 是Windows系统中广泛使用的图像文件格式 由于它可以不作任何变换地保存图像像素域的数据 因此成为我们取得RAW数据的
  • 【SIMULINK】基于DQ0模型的三相异步电机自制仿真模型教程

    SIMULINK 基于DQ0模型的三相异步电机自制仿真模型 其实 打开simscape自带的异步电机模型 里面也是基于DQ0的 电机的模型定子电压作为输入 定子电流是输出 内部结构 omega 1 是DQ坐标系的转速 为0时退化为 alph
  • 计算机是人类的好伴侣 作文,书是我们的好伴侣_我和书的故事作文

    书 大家是并不陌生的 它会让人陶醉享受 也会使人沉迷于此 总得来说 书 是我们的好伴侣 不管是休闲娱乐 还是读后写作都少不了它 说到我喜欢的书 我还是算得上是个小小小的 书迷 但是我最喜欢沈石溪所写的动物小说 内容精彩而又丰富 把这所有的动
  • Android性能分析和优化之traces.txt(ANR分析)

    ANR 类型分类 1 KeyDispatchTimeout 5 seconds 主要类型按键或触摸事件在特定时间内无响应 按键或者触摸引起的ANR的时间定于是在AMS中 static final int KEY DISPATCHING TI
  • C语言——文件操作

    C语言文件操作 使用文件的原因 文件 程序文件 数据文件 文件名 文件的打开和关闭 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 fseek ftell rewind 文本文件和二进制文件 文件读取结束的判定 文件缓冲区 使用
  • Python 入门习题

    如果下面代码有问题或者你有更好的实现方法欢迎与我私信 1 输入一个字符串 内容是带小数的实数 例如 123 45 输出是两个整数变量x和y x是整数部分123 y是小数部分45 你可以用split函数完成 str input L str s
  • iOS编程基础-OC(七)-运行时系统(续)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第7章 运行时系统 7 4 动态绑定 动态绑定 dynamic binding 是指在运行程序时 而不是在编译时 将消息与方法对应起来的处理过程 在运行程序和发送消息
  • Motionbuilder矩阵计算方式

    基本使用 对于类型为 FBModel 的对象 有 GetMatrix SetMatrix 方法来获取及设置其变换矩阵 GetMatrix pMatrix FBMatrix pWhat kModelTransformation pGlobal