这个案例是houdini安装后samples文件夹里面官方提供的,操作很简单就是把一个三维的模型某一个轴向设置为0,就是把一个模型拍扁。
这个案例主要讲了在有输入端的时候操作数据的一些注意事项,本地变量的操作,组的操作,几个默认的parm,简单的手动操作DataID,编写一个简单的Guide(就是图上蓝色的哪个网格,这个经常在一些生成点和发射器节点上看到类似的东西),分块操作点数据和一些简单的初学者应当知道的操作。
个人理解了大概百分之60左右。很多注释是我靠着自己的理解写上去的。是给自己做个笔记也希望能给其他人帮助。如果后续达到了更正确的理解我会在其他案例里面更新。
这个范例不是做一个完整的节点,只是给初学者说明一些常规操作的用法。
SOP_Flatten.h
//防止重复声明宏命令
#ifndef __SOP_Myflatten_h__
#define __SOP_Myflatten_h__
//SOP节点从这里继承
#include <SOP/SOP_Node.h>
//命名空间防止重复类名
namespace HDK_Sample {
class SOP_Myflatten : public SOP_Node
{
public:
SOP_Myflatten(OP_Network* net, const char* name, OP_Operator* op);
virtual ~SOP_Myflatten();
//对于组的操作
virtual OP_ERROR cookInputGroups(OP_Context &context, int alone = 0);
//构建函数
static OP_Node *myConstructor(OP_Network*, const char*, OP_Operator*);
//参数表
static PRM_Template myTemplateList[];
protected:
virtual bool updateParmsFlags();
//后面的const表示这个函数不会修改该类的任何成员数据的值
//前面的const由于const在*前面所以表示不能通过该指针修改指向数据的值
virtual const char *inputLabel(unsigned idx) const;
//操作节点数据的函数
virtual OP_ERROR cookMySop(OP_Context &context);
//编写一个guide
virtual OP_ERROR cookMyGuide1(OP_Context &context);
private:
void getGroups(UT_String &str) { evalString(str, "GROUP", 0, 0); }
fpreal DIST(fpreal t) { return evalFloat("dist", 0, t); }
int DIRPOP() { return evalInt("usedir", 0, 0); }
//(参数名,参数idx,time)
int ORIENT() { return evalInt("orient", 0, 0); }
fpreal NX(fpreal t) { return evalFloat("dir", 0, t); }
fpreal NY(fpreal t) { return evalFloat("dir", 1, t); }
fpreal NZ(fpreal t) { return evalFloat("dir", 2, t); }
//操作组
const GA_PointGroup *myGroup;
};
} //END HDK_Sample namespace
#endif
SOP_Flatten.cpp
#include "SOP_Myflatten.h"
#include <UT/UT_DSOVersion.h>
#include <OP/OP_OperatorTable.h>
#include <OP/OP_AutoLockInputs.h>
#include <UT/UT_Interrupt.h>
#include <iostream>
using namespace HDK_Sample;
void
newSopOperator(OP_OperatorTable *table)
{
//table frome <OP/OP_OperatorTable.h>