[转载][转载]maya 履带动画绑定插件 api 源码分享。

[转载] maya 履带动画绑定插件 api 源码分享
 
代码包下载地址:链接:http://pan.baidu.com/s/1OLCYE 密码:pj6k
 
下面的maya api源码,需要大家自己在vs里编译。

//首先是头文件代码:

//头文件名称:glideDeformer.h

 

#ifndef glideDeformer_h
#define glideDeformer_h

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

class glideDeformer:public MPxDeformerNode
{
public:
    glideDeformer(){};
    
virtual ~glideDeformer(){};

    static void * creator(){return new glideDeformer;};
    
static MStatus initializeAttr();

    virtual MStatus  deform(MDataBlock &block, MItGeometry &iter, const MMatrix &mat, unsigned int multiIndex);

    bool getClosestUVParam(MPoint & point,MFnNurbsSurface & surfaceFn,MObject surfaceData,double & paramU,double & paramV);
    bool getPointFroamSurfacePoint(MPoint & point,MFnNurbsSurface & surfaceFn,MObject surfaceData,double & paramU,double & paramV,MPoint & outPoint);
    
bool getPointAfterDeformed(MPoint & pointInSurfaceMatrix,MFnNurbsSurface & surfaceFn,MObject surfaceData,double & paramU,double & paramV,MPoint & pointAffterDeformed);

    static MString nodeName;
    
static MTypeId nodeId;

    static MObject glide;
    static MObject fixedBase;
    static MObject aimDirection;
    static MObject drivenSurface;
    
static MObject baseSurface;
};
#endif

 

//CPP文件

#include "glideDeformer.h"

MString glideDeformer::nodeName=MString("glideDeformer");
MTypeId glideDeformer::nodeId=MTypeId(0x87031);

MObject glideDeformer::glide;
MObject glideDeformer::fixedBase;
MObject glideDeformer::aimDirection;
MObject glideDeformer::drivenSurface;
MObject glideDeformer::baseSurface;

using std::cout;
using std::endl;

MStatus glideDeformer::initializeAttr()
{
    MFnNumericAttribute numattr;
    MFnTypedAttribute typedattr;
    
MFnEnumAttribute enumattr;

    glide=numattr.create("glide","gld",MFnNumericData::kFloat,0.0);
    numattr.setKeyable(true);
    
numattr.setStorable(true);

    fixedBase=numattr.create("fixedBase","fxb",MFnNumericData::kBoolean,0);
    numattr.setKeyable(true);
    
numattr.setStorable(true);

    aimDirection=enumattr.create("aimDirection","adr",0);
    enumattr.addField("directionU",0);
    enumattr.addField("directionV",1);
    enumattr.setKeyable(true);
    
enumattr.setStorable(true);

    drivenSurface=typedattr.create("drivenSurface","dsf",MFnData::kNurbsSurface);
    
typedattr.setStorable(false);

    baseSurface=typedattr.create("baseSurface","bsf",MFnData::kNurbsSurface);
    
typedattr.setStorable(false);

    //addAttribtue
    addAttribute(glide);
    addAttribute(fixedBase);
    addAttribute(drivenSurface);
    addAttribute(baseSurface);
    
addAttribute(aimDirection);

    attributeAffects(glide,outputGeom);
    attributeAffects(fixedBase,outputGeom);
    attributeAffects(aimDirection,outputGeom);
    attributeAffects(drivenSurface,outputGeom);
    
attributeAffects(baseSurface,outputGeom);

    return MS::kSuccess;
};


bool glideDeformer::getClosestUVParam(MPoint & point,MFnNurbsSurface & surfaceFn,MObject surfaceData,double & paramU,double & paramV)
{
    surfaceFn.setObject(surfaceData);
    MPoint tmpPoint=surfaceFn.closestPoint(point,0,0,false,0.001,MSpace::kWorld);
    MStatus stat=surfaceFn.getParamAtPoint(tmpPoint,paramU,paramV,true,MSpace::kWorld,0.001);
    
return true;
};


bool glideDeformer::getPointFroamSurfacePoint(MPoint & point,MFnNurbsSurface & surfaceFn,MObject surfaceData,double & paramU,double & paramV,MPoint & outPoint)
{
    surfaceFn.setObject(surfaceData);
    MVector tangentU;
    MVector tangentV;
    MVector normal;
    MPoint surfacePoint;
    surfaceFn.getPointAtParam(paramU,paramV,surfacePoint,MSpace::kWorld);
    normal=surfaceFn.normal(paramU,paramV,MSpace::kWorld);
    
surfaceFn.getTangents(paramU,paramV,tangentU,tangentV,MSpace::kWorld);

    tangentU.normalize();
    tangentV.normalize();
    
normal.normalize();

    double matrix[4][4]={{tangentU.x,tangentU.y,tangentU.z,0.0},{normal.x,normal.y,normal.z,0.0},{tangentV.x,tangentV.y,tangentV.z,0.0},{surfacePoint.x,surfacePoint.y,surfacePoint.z,1.0}};
    MMatrix surfacePointMatrix=MMatrix(matrix);
    //cout<<"baseSurfacePointMatrix:"<<surfacePointMatrix<<endl;
   
    outPoint=point*surfacePointMatrix.inverse();
    //cout<<"pointInSurfaceMatrixPosition:"<<outPoint<<endl;
    
return true;
};


bool glideDeformer::getPointAfterDeformed(MPoint & pointInSurfaceMatrix,MFnNurbsSurface & surfaceFn,MObject surfaceData,double & paramU,double & paramV,MPoint & pointAffterDeformed)
{
    surfaceFn.setObject(surfaceData);

    MVector tangentU;
    MVector tangentV;
    MVector normal;
    
MPoint surfacePoint;

    surfaceFn.getPointAtParam(paramU,paramV,surfacePoint,MSpace::kWorld);
    normal=surfaceFn.normal(paramU,paramV,MSpace::kWorld);
    
surfaceFn.getTangents(paramU,paramV,tangentU,tangentV,MSpace::kWorld);

    tangentU.normalize();
    tangentV.normalize();
    
normal.normalize();

    double matrix[4][4]={{tangentU.x,tangentU.y,tangentU.z,0.0},{normal.x,normal.y,normal.z,0.0},{tangentV.x,tangentV.y,tangentV.z,0.0},{surfacePoint.x,surfacePoint.y,surfacePoint.z,1.0}};
    MMatrix surfacePointMatrix=MMatrix(matrix);
    
//cout<<"drivenSurfacePointMatrix:"<<surfacePointMatrix<<endl;

    pointAffterDeformed=pointInSurfaceMatrix*surfacePointMatrix;
    
//cout<<"pointAffterDeformedPosition:"<<pointAffterDeformed<<endl;

    return true;
};


MStatus  glideDeformer::deform(MDataBlock &block, MItGeometry & iter, const MMatrix &mat, unsigned int multiIndex)
{
    //cout<<"deform()方法调用..."<<endl;
    MDataHandle envelopehandle=block.inputValue(envelope);
    MDataHandle glidehandle=block.inputValue(glide);
    MDataHandle fixedBasehandle=block.inputValue(fixedBase);
    MDataHandle aimDirectionhandle=block.inputValue(aimDirection);
   
    float envelopevalue=envelopehandle.asFloat();
    float glidevalue=glidehandle.asFloat();
    short aimDirectionvalue=aimDirectionhandle.asShort();
    
bool fixedBasevalue=fixedBasehandle.asBool();

    if (envelopevalue==0.0)
    {
        //cout<<"envelope值为0,跳过deform方法..."<<endl;
        return MS::kSuccess;
    
};

    MDataHandle drivenSurfacehandle=block.inputValue(drivenSurface);
    
MDataHandle baseSurfacehandle=block.inputValue(baseSurface);


    MFnNurbsSurfaceData surfaceDataFn;
    
MFnNurbsSurface surfaceFn;

    MObject drivenSurfaceData=drivenSurfacehandle.asNurbsSurface();
    
MObject baseSurfaceData=baseSurfacehandle.asNurbsSurface();

    MObject drivenSurfaceObj=surfaceDataFn.create();
    
MObject baseSurfaceObj=surfaceDataFn.create();

    surfaceFn.setObject(drivenSurfaceData);
    surfaceFn.copy(drivenSurfaceObj);
    int drivenSurfaceCvU=surfaceFn.numCVsInU();
    int drivenSurfaceCvV=surfaceFn.numCVsInV();
   
    surfaceFn.setObject(baseSurfaceData);
    surfaceFn.copy(baseSurfaceObj);
    int baseSurfaceCvU=surfaceFn.numCVsInU();
    
int baseSurfaceCvV=surfaceFn.numCVsInV();

    cout<<drivenSurfaceCvU<<"  "<<drivenSurfaceCvV<<"  "<<baseSurfaceCvU<<"  "<<baseSurfaceCvV<<" "<<endl;
    if (drivenSurfaceCvU==0||drivenSurfaceCvV==0||drivenSurfaceCvU==0||baseSurfaceCvU==0||baseSurfaceCvV==0)
    {
        //cout<<"drivenSurface或baseSurface不正确,变形不产生..."<<endl;
        MGlobal::displayWarning("drivenSurface或baseSurface不正确,变形不产生...");
        return MS::kSuccess;
    
};

 if (drivenSurfaceCvU!=baseSurfaceCvU||drivenSurfaceCvV!=baseSurfaceCvV)
 {
        //cout<<"drivenSurface与baseSurface不匹配,变形不产生..."<<endl;
        MGlobal::displayWarning("drivenSurface与baseSurface不匹配,变形不产生...");
        return MS::kSuccess;
 };
   
    MPoint pt;
    MPoint ptAfterDeformed;
    MPoint pointInSurfacePointMatrix;
    double paramU;
    double paramV;
    double newParamU;
    double newParamV;
    int index;
    float weight;
    bool test;
    if (fixedBasevalue==false)
    {
        //cout<<"履带模式..."<<endl;
        for(iter.reset();!iter.isDone();iter.next())
        {
            index=iter.index();
            //cout<<"index:"<<index<<endl;
            weight=weightValue(block,multiIndex,index);
            //cout<<"weight:"<<weight<<endl;
            if (weight==0)
            {
                //cout<<"权重为0,此点变形不产生..."<<endl;
                continue;
            };
            pt=iter.position(MSpace::kObject);
            pt=pt*mat;
            //cout<<"position:"<<pt<<endl;
           
      

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值