maya c++ API CMD部分

API 学习

Posted by elmagnifico on June 6, 2019

Maya-C++ API

常识

DAG

DAG:directed acyclic graph,DAG,DAG意思是有向无环图,所谓有向无环图是指任意一条边有方向,且不存在环路的图。

maya中,一个直接非循环图,定义了元素的位置,旋转以及比例。DAG由两类的DAG节点组成,transform(空间位置信息)和shape(模型网格信息)。

Transform节点中的是位置矩阵信息,包括位置、旋转、伸缩比例以及父级节点的对应信息,可以认为描述的就是这个模型在空间中的姿态信息。Shape节点存放的是模型几何数据的引用,shape顾名思义描述的就是这个模型的样子信息,他的顶点什么的应该在哪里,曲面曲线应该是怎样的等等。本质上shape里的位置信息都是相对于transform中的。

在最简单的情形中,DAG描述了一个对象的实例是如何从一块几何物体里构造而来的,比如创建一个球的时候,就同时创建了shape节点和transform节点,shape节点是对应的transform节点的子节点。

稍微复杂一点,这里会加上一个渲染的材质,就变成了,transform-shap-material

SMMS

类似于途中,描述几何信息的shape节点一定是叶结点

DAG节点相当于是maya里已经提前给你建立好的节点,这些节点的属性等都不能修改了,想要修改属性等要使用 MDGModifier 来创建。

DG

DG:Dependency Graph,依赖图中的节点是用来负责控制动画和维护网格构建历史的

DG和DAG混淆,依赖图中的节点是用来负责控制动画和维护网格构建历史的,而DAG中的节点则用于定义外形节点以及它的空间位置。

DAG节点之间可以形成父子关系(他们的关系非常稳定,不可以修改),而DG节点直接不可以,DG节点之间只是输入与输出的关系,而输入与输出是可以自定义的。

这么说有点不准确,DG里显示的一系列节点依赖,而DAG则是maya里的组织结构的基本模型,有向无环图。

DG插件的开发实质上是创建一些新的节点,将这些节点添加到依赖图中即可形成新的操作。Maya提供了十二种基本的类,派生自它们可以实现各种所需的功能。DG插件开发就是创建派生自这些基本类的新类,这些类都是以”MPx”开头,从文档Maya插件开发基础中可以知道这些类属于代理类,用于依赖图中构建各种节点。

基本的父类是”MPxNode”,派生自该类可以创建新的依赖节点(Dependency Node),它是Maya中最基础的DG节点。其他的十一个类均是派生自”MPxNode”。

代理类

maya里基本都是代理类,代理类通过构建一个代理类,将原先的容器多态化,从而可以通过代理类调用各种相似的类对象,并且可以调用其方法,而且将对应的内存管理也封闭在了代理类中,减轻后续的思考负担,但是代理类会引起在复制等操作的时候内存消耗加倍等情况,针对这个情况maya就有了各种句柄,也就是Mobject,用他们来操作,从而平衡了代理类的缺点.

例程详解

所有例程都位于: MAYA201x\devkit\plug-ins中,有些我细看过,有些没有,但是大致功能就是这样的.

前期先看一些简单的,了解一下maya的编程模型是什么样的,各种常用的类,常用的函数什么的.

复杂的就后面再看了,根据例程的命名,基本都是渐进式的,功能一点点变复杂.

大致列出来了所有CMD类型的例程,通过这些例程基本涵盖了大部分之前mel或者python中的一些脚本命令.有些命令试一下就能看出来比mel或者python运行上要快非常多.

  • helloWorldCmd 最基础的,教你认识世界
  • helixCmd 创建一个螺旋形,教你怎么处理参数,怎么获取当前选择,以及创建曲线和曲线的数据结构
  • helix2Cmd 在上一步的基础上,教你MPxCommand的完成结构
  • helixQtCmd 教你如何把qt的界面融入进来并且建立一个螺旋线
  • polyPrimitiveCmd 教你怎么创建自定义多边形,如何自定义mesh,如何分配shadinggroup,但是使用的是MEL而不是C++ API来做,这就很蠢
  • animInfoCmd 将指定范围,帧间隔,相机,额外属性的动画信息导出为一个xml格式文件,同时接收ESC作为打断。这里可以学习一下如何规范化处理参数,读写本地文件,修改全局渲染,如何获取当前场景帧,如何创建一个进度条
  • blindShortDataCmd 增加一个短整型的附加属性,如何建立一个属性,并添加到对象
  • blindDoubleDataCmd 增加一个自定义数据结构:MPxData,如何建立一个自定义数据结构,这个数据结构在maya里无法直接修改,其本身还是一个数据结构。
  • blindComplexDataCmd 增加一个自定义属性,类似于给一个DAG NODE增加了一个一个struct类型的属性
  • closestPointCmd 寻找点到平面上最近的点,并在该点上生成一个球,可以学会如何计算矩阵,计算世界坐标,如何获取属性
  • closestPointOnNurbsSurfaceCmd 寻找Nurbs表面上最近的点,但是我这里这个插件不能正常工作
  • convertBumpCmd 将灰度高度图转化成maya用的高度图,如何做文件过滤,如何使用maya的图片类读取图片,图片类型转换
  • convertEdgesToFacesCmd 将当前所选边可以连成的曲面都选择上,如何根据当前边寻找对应连接曲面
  • convertVerticesToEdgesCmd 将当前所选点可以连成的边都选择上,如何根据当前点寻找对应连接边
  • convertVerticesToFacesCmd 将当前所选点可以连成的曲面都选择上,如何根据当前点寻找对应连接曲面
  • createClipCmd 创建一个动画片段 如何使用MFnCharacter,MFnAnimCurve,创建一个动画片段
  • cvPosCmd 获取一个顶点的坐标,如何获取 transform 空间 MSpace::Space,
  • cvExpandCmd 扩展选择返回对象的形式,如果选择多个CV点 表示是1-20这样的,使用扩展以后显示的就是1,2,3….20. 通过这个可以学会怎么用 MSelectionList
  • dagPoseInfoCmd 这个可以输出骨骼的姿态信息到一个文件中,具体没细看.
  • dagMessageCmd 增加一个回调函数,返回当前dag节点连接或者断开状态,学习如何建立一个回调函数,寻找父子节点上下游之类的东西.
  • deletedMsgCmd 增加三个删除回调函数,在删除当前节点相关内容的时候进行回调
  • findFileTexturesCmd 找到一个渲染组中的文件材质节点,教你如何寻找依赖节点,并且使用DG迭代器
  • findTexturesPerPolygonCmd 找到每个多边形的文件材质,但是这个代码本身有点问题,实际可以编译通过,但是却找不到任何文件材质,不过倒是可以学会怎么找对应的材质,shadernode什么的。
  • iffInfoCmd 返回maya iff 文件信息,如何操作iff文件类型
  • multiPlugInfoCmd 显示当前子插件命令信息
  • nodeInfoCmd 返回一个节点的类型以及连接的属性信息,可以学会如何查找对应的一个节点的类型和属性
  • particlePathsCmd 使用曲线勾出来所有粒子的运动路径,学会如何使用 ParticleIdHash,如何获取粒子位置信息
  • motionPathCmd 实现一个路径动画功能
  • nodeMessageCmd 注册一个 MNodeMessage 的回调函数
  • intersectCmd 寻找聚光灯与mesh交叉的地方,或者说找到mesh上被聚光灯照亮的部分
  • nodeCreatedCBCmd 任何一个节点被创建时调用一个mel
  • fileIOMsgCmd 如何使用关于文件导入导出前的回调函数
  • exportJointClusterDataCmd 导出骨骼集合信息
  • exportSkinClusterDataCmd 导出皮肤集合信息
  • flipUVCmd 快速翻转UV 如何使用 MPxPolyTweakUVCommand
  • fluidInfoCmd 使用 MFnFluid 来获取到流体信息
  • blastCmd 如何使用后台渲染API
  • blast2Cmd 如何从VP2中捕获帧
  • zoomCameraCmd 获取当前激活窗口,并且修改摄像机信息
  • whatis 显示当前选择的对象相关信息
  • volumeLightCmd 创建一个体积灯光,并且查询和设置其属性
  • viewCaptureCmd 使用OpenGL来捕获3d视窗并且输出到一个ppm文件
  • userMsgCmd 如何使用 MUserEventMessage
  • undoRedoMsgCmd 如何监听撤销和重做的事件信息,如何使用 MEventMessage
  • translateCmd 修改控制点的位置
  • threadTestCmd 如何使用 MThreadPool 计算素数,如何使用maya多线程
  • threadTestWithLocksCmd 带锁多线程
  • testCameraSetCmd 如何使用 MFnCameraSet
  • surfaceTwistCmd 扭曲mesh表面
  • surfaceCreateCmd 创建表面
  • splitUVCmd 拆分UV,并且处理对应poly的变形历史、扭曲等
  • spiralAnimCurveCmd 控制对象螺旋运动
  • scanDagCmd 扫描整个dag依赖节点
  • sampleCmd 简化shadinggroups
  • richMoveCmd 交互性工具,用于移动对象
  • renderViewRenderCmd 如何使用 MRenderView 来渲染
  • renderViewRenderRegionCmd 更新渲染范围
  • renderViewInteractiveRenderCmd 交互性
  • referenceQueryCmd 查询参考文件
  • progressWindowCmd 如何使用 MProgressWindow
  • getAttrAffectsCmd 查询节点所有属性影响和被影响的所有相关属性
  • iffPixelCmd 返回 iff文件对应位置的rgb
  • iffPpmCmd iff文件转成ppm格式文件
  • instanceCallbackCmd 如何使用 MDagMessage 以及其回调
  • instancerListCmd 如何使用 MFnInstancer 精灵贴片相关
  • intersectOnNurbsSurfaceCmd nurbs的交叉面计算
  • listLightLinksCmd 如何使用 MLightLinks 来查询灯光连接信息
  • listPolyHolesCmd 如何使用 MFnMesh::getPolyHoles() 来获取mesh的hole信息
  • listRichSelectionCmd 移动工具
  • meshOpCmd mesh的一些高级操作
  • motionTraceCmd 显示一个运动对象的运动曲线
  • moveCurveCVsCmd 移动控制顶点到原点
  • nodeIconCmd 给一个node icon图标
  • particleSystemInfoCmd 通过 MFnParticleSystem 获取到粒子相关信息
  • peltOverlapCmd 寻找重叠面
  • pfxInfoCmd 通过 MFnPfxGeometry 获取 pfx 信息
  • pickCmd 选择命令,符合条件的命名都被选中
  • polyMessageCmd MPolyMessage 的回调

How to

http://ewertb.mayasound.com/api/api.php

有一些国外的参考可以找到相关API如何调用,什么功能怎么实现

https://forums.cgsociety.org/c/autodesk/maya-programming

cgsociety 可以提问,看看是否有大佬可以帮忙什么的

https://stackoverflow.com/questions

stackoverflow 上也有一部分maya相关的提问什么的

https://forum.highend3d.com/c/maya-help-forums

highend3d 也有maya板块,但是人比较少

总结

maya API 相关的资料也好,例程也好,相对来说领域细分的比较小,很多东西不好找,只能自己多看看多琢磨琢磨

参考

https://blog.csdn.net/kfqcome/article/details/9151231

https://www.cnblogs.com/lzm-cn/articles/9094617.html

https://blog.csdn.net/lulongfei172006/article/details/53871133

http://ewertb.mayasound.com/maya.php

https://nccastaff.bournemouth.ac.uk/jmacey/RobTheBloke/www/research/maya/mfnmaterial.htm

https://www.cnblogs.com/bubbler/p/5152228.html

https://blog.csdn.net/efxer/article/details/12371529

https://blog.csdn.net/huangzhipeng/article/details/5892320

http://forums.cgsociety.org/t/create-primitives-with-the-api/1444485

https://forums.cgsociety.org/t/list-environment-variables/1343217