C++Maya-从帧和子帧获取网格顶点

C++ Maya - Getting mesh vertices from frame and subframe

本文关键字:网格 顶点 获取 C++Maya-      更新时间:2023-10-16

我正在编写一个网格变形器插件,该插件从过去的帧中获取有关网格的信息以执行一些计算。过去,为了获得过去的网格信息,我做了以下

MStatus MyClass::deform(MDataBlock& dataBlock, MItGeometry& itGeo, 
        const MMatrix& localToWorldMatrix, unsigned int index)
{
    MFnPointArrayData fnPoints;

    //... other init code

    MPlug meshPlug = nodeFn.findPlug(MString("inputMesh"));
    // gets the mesh connection from the previous frame
    MPlug meshPositionPlug = meshPlug.elementByLogicalIndex(0);
    MObject objOldMesh;
    meshPositionPlug.getValue(objOldMesh);
    fnPoints.setObject(objOldMesh);
    // previous frame's vertices
    MPointArray oldMeshPositionVertices = fnPoints.array();

    // ... calculations

    return MS::kSuccess;
}

如果我需要多个帧,我会在逻辑索引上运行循环并重复这个过程。然而,自从创建这个插件以来,我发现我的插件的需求不仅可以获得过去的帧,还可以获得未来的帧以及子帧(整数帧之间)。由于我当前的代码依赖elementByLogicalIndex()来获取过去的帧信息,并且它只接受无符号整数,而第0个索引指的是前一帧,所以我无法获取子帧信息。我还没有尝试获取未来的帧信息,但我认为这也不可能。

如何查询阵列中过去/未来/子帧的网格顶点位置?我目前的方法不灵活吗?如果是,我还能怎么做?

因此,实现这一目标的"预期"方法是使用MDGContext,或者使用MDGCntextGuard,或者使用明确接受上下文的MPlug.asObject版本(尽管这些版本已被弃用)。

话虽如此,在过去,当我尝试在其他时候使用MDGContexts查询值时,我发现它们要么非常慢,要么不稳定,要么两者兼而有之。所以要小心使用。如果像你说的那样,纯粹处理来自alembic网格的对象,事情可能会更好地工作。然而,如果是这样的话,您可能会更幸运地从节点读取缓存路径,并直接自己通过alembic API进行查询。