Mesh を作るプラグイン

ソース

// 三角形のメッシュを一つ作るコマンド・プラグイン

#include <stdio.h>
#include <maya/MString.h>
#include <maya/MIntArray.h>
#include <maya/MFloatPointArray.h>
#include <maya/MFnMesh.h>
#include <maya/MArgList.h>
#include <maya/MFnPlugin.h>
#include <maya/MPxCommand.h>

class simplePoly : public MPxCommand
{
	public:
	MStatus doIt( const MArgList& args );
	static void* creator();
};

// コマンドで実行される計算・処理を実行するメソッド。
MStatus simplePoly::doIt( const MArgList& args )
{
	int num_verts = 3;           // 頂点の個数
	int num_faces = 1;           // フェースの個数
	int edges_per_face = 3;      // 1 フェースあたりのエッジの個数
	MFloatPointArray pointArray; // 頂点の座標
	MIntArray faceCounts;        // 1 フェースあたりの頂点数
	MIntArray faceConnects;      // フェースの結線情報
	MObject newTransform;        // メッシュの親になるトランスフォーム・ノード
	static int p_gons[3] = {0, 1, 2}; // 3 角メッシュの結線情報
	MFnMesh fnPoly;              // 作られるメッシュ
	MDGModifier dgModifier;      // MELコマンドを実行するための Modifier
	MStatus stat;

	// 各配列のクリア
	faceCounts.clear();
	faceConnects.clear();
	pointArray.clear();

	// 頂点座標を追加
	pointArray.append( MFloatPoint(0.0, 0.0, 0.0) );
	pointArray.append( MFloatPoint(0.0, 1.0, 0.0) );
	pointArray.append( MFloatPoint(0.0, 0.0, 1.0) );
	// 1 フェースあたりの頂点数を追加
	for(int i = 0; i < num_faces; i++)
		faceCounts.append( edges_per_face );
	// フェースの結線情報を追加
	for(int i = 0; i < (num_faces*edges_per_face); i++)
		faceConnects.append( p_gons[i] );
	// Mesh を作る
	newTransform = fnPoly.create( num_verts, num_faces, pointArray, 
		faceCounts, faceConnects, MObject::kNullObj, &stat );
	if(MS::kSuccess != stat)
	{
		displayError("Could not create a polygon");
		return stat;
	}

	// シェーダーにコネクトする
	MString cmd("sets -e -fe initialShadingGroup ");
	cmd += fnPoly.name();
	dgModifier.commandToExecute( cmd ); // コマンド(sets)の登録
	MFnDagNode fnDagNode( newTransform, &stat );
	if ( MS::kSuccess == stat )
	{
		// トランスフォーム・ノードをセレクトしておく
		cmd = "select ";
		cmd += fnDagNode.name();
		dgModifier.commandToExecute( cmd ); // コマンド(select)の登録
	}
	dgModifier.doIt(); // 登録したコマンド(sets と select)の実行

	return MS::kSuccess;
}

// コマンドが実行された時にコマンドの実体(インスタンス)を作って返す。
void* simplePoly::creator()
{
	return new simplePoly;
}

// プラグインがロードされるときに実行される。
MStatus initializePlugin( MObject obj )
{
	MFnPlugin plugin( obj, "Alias|Wavefront", "1.0", "Any");
	plugin.registerCommand( "simplePoly", simplePoly::creator );
	return MS::kSuccess;
}

// プラグインがアンロードされるときに実行される。
MStatus uninitializePlugin( MObject obj )
{
	MFnPlugin plugin( obj );
	plugin.deregisterCommand( "simplePoly" );

	return MS::kSuccess;
}

参考


Prev
Home | Contents
Mail