zoukankan      html  css  js  c++  java
  • 一、Maya API简介

    #include <maya/MSimple.h>
    #include <maya/MIOStream.h>
    DeclareSimpleCommand( hello, "Autodesk", "2013");
    MStatus hello::doIt( const MArgList& args )
    {
        cout << "Hello " << args.asString( 0 ).asChar() << endl;
        return MS::kSuccess;
    }

    MArgList接受来自MEL command输入的命令参数。

     一个创建NURBS CURVE的例子: 可以学到1命令的parse, 2创建MObject的方法。3. Maya中的数据结构使用

    #include <math.h>
    #include <maya/MSimple.h>
    #include <maya/MIOStream.h>
    #include <maya/MFnNurbsCurve.h>
    #include <maya/MPointArray.h>
    #include <maya/MDoubleArray.h>
    #include <maya/MPoint.h>
    DeclareSimpleCommand( helix, "Autodesk - Example", "3.0");
    MStatus helix::doIt( const MArgList& args )
    {
        MStatus stat;
        const unsigned      deg     = 3;                    // Curve Degree
        const unsigned      ncvs    = 20;                   // Number of CVs
        const unsigned      spans   = ncvs - deg;   // Number of spans
        const unsigned      nknots  = spans+2*deg-1;// Number of knots
        double      radius                  = 4.0;                  // Helix radius
        double      pitch                   = 0.5;                  // Helix pitch
        unsigned    i;
        // Parse the arguments.
        for ( i = 0; i < args.length(); i++ )
            if ( MString( "-p" ) == args.asString( i, &stat )
                && MS::kSuccess == stat)
            {
                double tmp = args.asDouble( ++i, &stat );
                if ( MS::kSuccess == stat )
                    pitch = tmp;
            }
            else if ( MString( "-r" ) == args.asString( i, &stat )
                && MS::kSuccess == stat)
            {
                double tmp = args.asDouble( ++i, &stat );
                if ( MS::kSuccess == stat )
                    radius = tmp;
            }
        MPointArray  controlVertices;
        MDoubleArray knotSequences;
        // Set up cvs and knots for the helix
        //
        for (i = 0; i < ncvs; i++)
            controlVertices.append( MPoint( radius * cos( (double)i ),
            pitch * (double)i, radius * sin( (double)i ) ) );
        for (i = 0; i < nknots; i++)
            knotSequences.append( (double)i );
        // Now create the curve
        //
        MFnNurbsCurve curveFn;
        MObject curve = curveFn.create( controlVertices,
            knotSequences, deg, 
            MFnNurbsCurve::kOpen, 
            false, false, 
            MObject::kNullObj, 
            &stat );
        if ( MS::kSuccess != stat )
            cout << "Error creating curve.
    ";
        return stat;
    }

    MObject是maya中所有node的父类,function sets用来对object进行操作。

    Proxies用来创建除了maya中除了MObject之外对象。包括 command对象,file translator对象,和shader的对象。

    二、关于和MAYA交互的方法:

    1. 有4中方式:wrappers, objects, function sets, proxies

    2. 操纵maya的objects:

    (1)object类型:curves, surfaces, DAG nodes, dependency graph nodes, lights, shaders, textures,etc) 

    (2)操作这些object 的handle是MObject, MObject的析构函数不会delete object本身,只会delete the handle object

    不能使用指针指向MObject,而是用MobjectHandle

    3. Wrappers:简单的object,例如math classes, vectors, matrices, 他们是普通c++类的包装,例如MPointArray 和MDoubleArray。

    在循环中不要申明wrapper, 除了静态的MGlobal

    4. object 和 function set通常一起使用。

    创建一条curve

    MFnNurbsCurve curveFn;
    MObject curve = curveFn.create( ... );
    • MFnNurbsCurve curveFn; creates a new curve function set which contains methods for operating on curve objects, and the create method in particular is used to create new curves.
    • MObject curve = curveFn.create( ... );creates a new Maya curve object which you can then use however you like

    If you add a third line:

    curve = curveFn.create( ... );

    a second curve is created and the curve MObject now references the new curve. The first curve still exists—it simply is no longer referenced by the MObject handle.

    5. Proxies:

    • MPx - Classes with this prefix are all Proxies, API classes designed for you to derive from and create your own object types.

    6.MIt - These classes are iterators and work on MObjects much the way a function set does. 

    7. Error Check: 

    The addition of &stat to the asString() and asDouble() methods allows you to check if the casting operation succeeds.

    For example, args.asString(i, &stat) could return MS::kFailure if the index is greater than the number of arguments。

    MStatus类的作用:(1)重载了逻辑运算符,可以直接if进行判断。(2)可以获得MstatusCode枚举出错原因

    (3)通过errorString()方法获得包含error信息的Mstring

    (4)通过perror()函数打印

    (5)重载== /!=运算符,可以和Mstatuscode进行比较

  • 相关阅读:
    1104 Sum of Number Segments (20 分)(数学问题)
    1092 To Buy or Not to Buy (20 分)(hash散列)
    1082 Read Number in Chinese (25 分)(字符串处理)【背】
    1105 Spiral Matrix (25 分)(模拟)
    初识网络安全及搭建网站(内网)
    HTML5开发者需要了解的技巧和工具汇总(转)
    native+web开发模式之web前端经验分享
    移动平台3G手机网站前端开发布局技巧汇总(转)
    Asp.net 中图片存储数据库以及页面读取显示通用方法详解附源码下载
    使用H3Viewer来查看VS2010的帮助文档
  • 原文地址:https://www.cnblogs.com/bubbler/p/5152228.html
Copyright © 2011-2022 走看看