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

时间:2016-05-08 21:16:19

标签: c++ 3d maya mesh

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

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;
}

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

如何在过去/未来/子帧中查询数组中的网格顶点位置?我现在的方法是不灵活的,如果是这样,我怎么能这样做呢?

1 个答案:

答案 0 :(得分:0)

因此,实现此目标的“预期”方法是使用MDGContextMDGContextGuard或显式采用上下文的MPlug.asMObject版本(尽管这些是不推荐使用。

这么说-过去,当我尝试使用MDGContexts在其他时间查询值时,我发现它们要么很慢,要么不稳定,或者两者兼而有之。因此,请谨慎使用。如您所说,如果您纯粹处理来自alembic网格的物体,事情可能会更好。但是,在这种情况下,您可能会更好地从节点读取缓存路径,然后直接通过Alembic API查询。