В эти дни я пишу в Maya API (C ++), и первое, что меня немного смутило, это то, что когда вы определяете класс в вашем заголовочном файле, очевидно, вам нужно только сделать статическую переменную-член (атрибуты), так что все экземпляры делятся общими данными. В то же время, например, в Maya, когда я создаю экземпляр плагина с именем «Сфера», он создает его, и я могу изменить атрибуты, и все работает отлично. Но когда я создаю другой объект Sphere на сцене Maya, статические атрибуты также имеют свои локальные значения. Как если бы я изменилсяSphere2.radius«это не обновит первый экземпляр»Sphere1.radius» совсем.
Вот код, который делает то же самое поведение:
class Morpher : public MPxDeformerNode
{
public:
Morpher();
virtual ~Morpher();
static void* creator();
static MStatus initialize();
virtual MStatus deform(
MDataBlock& data,
MItGeometry& itGeo,
const MMatrix& localToWorldMatrix,
unsigned int geomIndex);
static MTypeId id;
static MObject aBlendMesh;
static MObject aRadius;
};
И функция инициализации:
MStatus Morpher::initialize(){
MStatus status;
MFnNumericAttribute nAttr;
MFnTypedAttribute tAttr;
aBlendMesh = tAttr.create("blendMesh", "blendMesh", MFnData::kMesh);
addAttribute(aBlendMesh);
attributeAffects(aBlendMesh, outputGeom);
aRadius = nAttr.create("radius", "radius", MFnNumericData::kFloat);
nAttr.setKeyable(true);
nAttr.setMin(0);
nAttr.setMax(1);
addAttribute(aRadius);
attributeAffects(aRadius, outputGeom);
MGlobal::executeCommand(
"makePaintable -attrType multiFloat -sm deformer blendMesh weights;");
return MS::kSuccess;
}
Итак, я хотел бы знать, есть ли у вас, ребята, опыт работы с этим API, или я неправильно понимаю статическую концепцию, или Maya обрабатывает эту часть по-своему?
Спасибо,
Ответ очень прост (хотя я согласен, что и люди, и документация майя злоупотребляют терминологией, когда говорят «атрибут»)
Когда вы создаете свой класс C ++, статические переменные являются определениями атрибутов — определение атрибута — это не экземпляры значений, а только описание того, что это за атрибут.
Позже, когда вы создадите экземпляр узла Maya, Maya прочитает определение, чтобы создать атрибут, в котором вы можете сохранить значение. Этот атрибут тот, который вы видите в Maya, и значения этого хоста.
Статические переменные (то есть определение атрибута) уникальны и одинаковы для всех экземпляров. Атрибут узла принадлежит экземплярам узла Maya и отличается от других узлов.
У меня есть пара статей, рассказывающих об атрибутах, если вам нужны дальнейшие чтения:
http://around-the-corner.typepad.com/.services/blog/6a0163057a21c8970d0163057a224d970d/search?filter.q=attributes