トップ | puarts.com
メモ  |  制作記  |  開発記  |  日常の記録  |  デジタルコンテンツ制作  |  ファイアーエムブレム  |  ゲーム  |  C/C++  |  C#  |  PC/ソフトウェア  |  Web 開発  |  スクリプト言語  |  その他プログラミング  |  
「OpenMaya」に関連する記事一覧

0  

OpenMaya ポリゴンを生成するサンプル

2012/07/09

昔MELで作ったボロノイ分割をMayaのC++プラグインで作って高速にしたいと思い、Mayaのプラグインを作っています。とりあえず、コマンドとしてポリゴンを分割するプラグインを作ろうとしています。MayaのAPIを触るのは久しぶりなので徐々に思い出しながら作っています。完成するかわからないですがのんびりやっていきます。

とりあえず、思い出したOpenMayaでポリゴンを生成するコードをまた忘れぬよう載せておきます。

4つの頂点を持つ平面ポリゴンを生成するコード

MFnMesh fn_mesh;

/* Create Polygon */
float src_ver_list[][4] = {
	{-1.0f, 0.0f, 1.0f, 0.0f},
	{ 1.0f, 0.0f, 1.0f, 0.0f},
	{ 1.0f, 0.0f,-1.0f, 0.0f},
	{-1.0f, 0.0f,-1.0f, 0.0f}
};
int num_poly = 2;
int src_poly_cnt[] = {3, 3};
int src_poly_connects[] = {
	0, 1, 3, 
	1, 2, 3
};
MFloatPointArray ver_list(src_ver_list, 4);
MIntArray poly_cnt(src_poly_cnt, 2);
MIntArray poly_connects(src_poly_connects, 6);
fn_mesh.create( 
	ver_list.length(), 
	num_poly, 
	ver_list, 
	poly_cnt, 
	poly_connects
);

OpenMaya 選択しているポリゴンの頂点を移動するサンプル

2012/07/08

OpenMayaのメモです。後で忘れてもすぐ思い出せるようにシンプルなコードを載せておきます。

選択しているメッシュの頂点をすべてY軸に10だけずらすコード

MSelectionList sel_list;
MGlobal::getActiveSelectionList( sel_list );

MItSelectionList sel_list_iter( sel_list );
sel_list_iter.setFilter( MFn::kMesh );

for( ; !sel_list_iter.isDone(); sel_list_iter.next() )
{
	MDagPath mesh_dag_path;
	MFnMesh fn_mesh;
	MPointArray point_list;

	sel_list_iter.getDagPath(mesh_dag_path);
	fn_mesh.setObject(mesh_dag_path);
	fn_mesh.getPoints(point_list, MSpace::kWorld);

	int len = point_list.length();
	for( int i = 0; i < len; ++i ){
		point_list[i].y += 10;
	}

	fn_mesh.setPoints( point_list, MSpace::kWorld );
}

OpenMaya カスタムコマンドでフラグなしの引数を取得

2012/04/15
MELやPythonでは一発でできない文字列操作用のカスタムコマンドをC++で作ろうと思い、久しぶりにOpenMayaを触ったんですが、ほとんど細かいところを忘れてしまっていました。

そのうちまた仕事で使うことになる可能性が高いので、思い出した内容を備忘録も兼ねてここに記していこうと思います。

とりあえず、カスタムコマンドにフラグなしの引数を与えて、戻り値を返す書き方すら忘れてしまっていたので、それを書いておきます。

シンプルな例として2つの引数を加算して戻り値で返すだけのmyCommandコマンドを作ることを考えます。Mayaで実行すると次のように結果が返るコマンドです。

myCommand 4 7;

// Result: 11 // 
 
まずカスタムコマンドを作るためにはMPxCommandクラスを継承したクラスを作る必要がありました。myCommandコマンドの中身を定義するMyCommandクラスをMPxCommandを継承して作ります。

下記はMyCommandクラスのdoIt関数の中身です。



MStatus MyCommand::doIt(const MArgList& args)

{

        MStatus stat;

        int res;



        //** check number of arguments

        if(args.length() != 2) { 

                return MStatus::kFailure; 

        }



        //** get 1st argument as MString

        int a = args.asInt(0, &stat);

        if(stat!=MS::kSuccess)

        { return MStatus::kFailure; }



        //** get 2nd argument as int

        int b = args.asInt(1, &stat);

        if(stat!=MS::kSuccess)

        { return MStatus::kFailure; }



        //** main operation(add 2 values)

        res = a+b;



        //** set return value

        MPxCommand::setResult(res);



        return MStatus::kSuccess;

}


args.asInt(0, stat)で0番目の引数の値を整数型で取得します。statには成功したか失敗したかが入ります。同じくargs.asInt(1, stat)で1番目の引数の値を整数型で取得します。

最後にsetResult(res)で戻り値にresの値が設定されます。

本当に基本的なことですが、最近記憶力が衰えてきて、しばらく触っていないと忘れてしまいます。メモはつけるように心がけたいです。

OpenMaya DAGノードを作る

2011/10/15
久しぶりにOpenMaya (C++)を使ってMaya API開発をしたのですが、昔勉強した記憶が完全に失われていることに気がつきました。Mayaに入っているSampleや昔の自分のコードを見ながら少しずつ使い方を思いだしています。

とりあえず、DAGノードの作り方(MELで言うcreateNodeコマンドの機能)を思いだしたのでメモしておきます。

DAGノードをつくるときはMFnDagNodeのcreate()を使うんだったんですね。
例えばlocatorを作りたい場合のコードは以下。

MFnDagNode fn_dag;
MObject locator = fn_dag.create(MString("locator"));

OpenMaya 回転行列をオイラー角に変換

2011/02/21
KINECTとNITEで取得したスケルトンの回転行列をMayaに持ってくるためにオイラー角に変換しようと思ったのですが、回転行列からオイラー角を求める計算って普通にやろうとすると結構複雑で手間がかかりそうだったのでOpenMayaのMTransformationMatrixクラスを使って変換しました。
他にもOGREを使ってたらQuaternionクラスから簡単に変換できるみたいです。

下記にMTransformationMatrixクラスを使った回転行列からオイラー角への変換の例を記します。

OpenMayaも別にMayaのプラグインにしか使えないというわけではなく、下記の例のようにコンソールアプリケーションなんかでも使えるので意外なところで役に立つかもしれません。

Example

#define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#define _BOOL

#include <maya/MMatrix.h>

#include <maya/MTransformationMatrix.h>

#pragma comment(lib, "OpenMaya.lib")



int main(){

    double eulerRot[3];

    double mat[4][4]={{0.8047, -0.5059, -0.3106, 0},

                      {0.3106,  0.8047, -0.5059, 0},

                      {0.5059,  0.3106,  0.8047, 0},

                      {     0,       0,       0, 1}};



    MMatrix rotmat(mat);

    MTransformationMatrix transform(rotmat);

    MTransformationMatrix::RotationOrder order;

    order = MTransformationMatrix::kXYZ;

    transform.getRotation(eulerRot,

                          order, 

                          MSpace::kObject);



    printf("Euler Rotation: %f %f %f\n", 

            eulerRot[0]*180/M_PI, eulerRot[1]*180/M_PI,

            eulerRot[2]*180/M_PI);

    return 0;

}

// Euler Rotation: -32.157376 18.095868 -32.156815


Maya Image-based Modeling用プラグインを開発中

2010/07/04

複数枚の2次元画像から3Dモデルを作るようなMayaのPlug-inを開発中です。

イメージベースドモデリングをやってみたいのです。

今、とりあえず深度情報から3次元モデルを起こすような簡単なプラグインを作りました。

これがもとの深度です。

face_depth.jpg


そして、これが深度から作った3次元モデルです。

 face_depthMesh.jpg

 深度情報が離散データなので、サーフェイスがぼこぼこしてしまっています。

離散データであり、かつ縦横軸の解像度に比べ、深度方向の解像度が足りていないためにこのようになってしまいっています。

すなわち、深度方向の解像度を補間して縦横の解像度と同じレベルまで引き上げる処理が必要になります。

次はそれを実装しようと思います。

Maya API 初めてのオリジナルプラグイン

2009/07/12
初めてオリジナルのMayaプラグインを作成しました。

ノードの入力に接続した移動値によってスケールがかかるプラグインです。

オブジェクトを選択して、コマンドを実行すると、新しいノードができて、それと接続されて、自動でスケールがかかるような仕様です。

zScaleImage.gif








ノードは次のように接続されます。

zscaleNodeImage.gif 









何の役にも立たないプラグインですが、プラグイン開発の第1歩をようやく踏み出せた気がします。

Maya API 最低限必要な関数

2009/06/23

ずっとMaya APIを作ろうとしていて放置していました。そのおかげでせっかく勉強したこともほとんど忘れてしまいました。
もう一度習得しなおそうと思います。そして今度こそMayaのプラグイン作ります。勉強したことをちょくちょく書いていこうと思います。

さて、とりあえず始めはAPIを作る上で最低限必要な関数をおさらいしておきます。

以下がMaya APIを作る上で最低限必要な関数です。

・initializePlugin() ⇒ プラグインロード時に実行される関数

・uninitializePlugin() ⇒ プラグインアンロード時に実行される関数

・コマンド用クラス ⇒ コマンドを定義するためにコマンドのclassはMPxCommandを継承する
  例えばTestCmdというクラスの場合

  class TestCmd:public MPxCommand{
  public:
       virtual MStatus doIt(const MArgList&);  
       static void *creator(){return new TestCmd} 
  }

というように定義します。
doItはコマンドの中身を実行するものです。creatorはコマンドが実行される毎にコマンドのインスタンスを生成します。これはundo、redoを可能にするためです。

・コマンドの実行する中身を定義する関数(doIt)
    MStatus TestCmd::doIt(const MArgList& args){
    }


以下はhelloと表示するだけのサンプルコードです。

#include <maya/MPxCommand.h>
#include <maya/MGlobal.h>
#include <maya/MFnPlugin.h>

class testCmd : public MPxCommand{
public:
 virtual MStatus doIt(const MArgList&)
 {
  MGlobal::displayInfo("hello\n");
  return MS::kSuccess;
 }
 static void *creator() {
  return new testCmd;
 }
};

MStatus initializePlugin( MObject obj ){
 MFnPlugin plugin(obj,"wsp", "1.0");
 MStatus stat;
 stat = plugin.registerCommand("test", testCmd::creator);
 if(!stat)
  stat.perror("registerCommand failed");
 return stat;
}

MStatus uninitializePlugin(MObject obj){
 MFnPlugin plugin(obj);
 MStatus stat;
 stat = plugin.deregisterCommand("test");
 if(!stat)
  stat.perror("deregisterCommand failed");
 return stat;
}

0  

にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

0.0286 sec

Copyright(C)2006-2018 wsp All Rights Reserved