我正在编写一个网格变形器插件,它可以从过去的帧中获取有关网格的信息,以执行一些计算。在过去,为了获得过去的网格信息,我做了以下
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个索引引用前一帧,因此我无法获得子帧信息。我还没有尝试过获取未来的帧信息,但我认为这也不可能。
如何在过去/未来/子帧中查询数组中的网格顶点位置?我现在的方法是不灵活的,如果是这样,我怎么能这样做呢?
答案 0 :(得分:0)
因此,实现此目标的“预期”方法是使用MDGContext,MDGContextGuard或显式采用上下文的MPlug.asMObject版本(尽管这些是不推荐使用。
这么说-过去,当我尝试使用MDGContexts在其他时间查询值时,我发现它们要么很慢,要么不稳定,或者两者兼而有之。因此,请谨慎使用。如您所说,如果您纯粹处理来自alembic网格的物体,事情可能会更好。但是,在这种情况下,您可能会更好地从节点读取缓存路径,然后直接通过Alembic API查询。