ポリゴンの複製

CINEMA 4DおよびBodyPaint 3Dに関する一般的な議論や情報交換をするフォーラムです。
BUTTON_POST_REPLY
tofuji
記事COLON 828
登録日時COLON 2011年3月10日(木) 10:41
お住まいCOLON 東京都渋谷区

ポリゴンの複製

投稿記事 by tofuji » 2011年9月25日(日) 11:24

 こんにちは冨士です。

 CINEMA 4Dにはポリゴンを複製する機能がないということなので、いくつかの機能をマクロ化し、
スクリプトで実行できるようにしました。

http://www2.11moon.com/sample_files/201 ... lygons.mp4
 
 スクリプトファイルをダウンロードし、以下のディレクトリの中に入れて下さい。
「/Users/***your user name***/Library/Preferences/MAXON/CINEMA 4D R12_********/library/scripts」

http://www2.11moon.com/sample_files/201 ... lygons.zip

 スクリプトは、「プラグイン -> ユーザスクリプト」に表示されます。
また、コマンドマネージャやスクリプトマネージャからショートカットを指定できます。

 スクリプトの全文は以下の通りです。

コードCOLON 全て選択

CallCommand(14046); 												// disconnect

var obj1= doc->GetActiveObject();					//get original object
var oname= obj1->GetName();
var pslct= obj1->GetPolygonSelection();		//get polygon selection
pslct->DeselectAll();											//deselect all
obj1->SetPolygonSelection(pslct);					

var obj2= obj1->GetNext();									//get disconnected object
pslct= obj2->GetPolygonSelection();				//get polygon selection
var psnum= obj2->GetPolygonCount();				//get polygon count
pslct->SelectAll(0,psnum-1);								//select all

obj2->Remove();															//first, remove the disconnected object from object manager
doc->InsertObject(obj2,obj1,NULL);					//insert it as a child of original object
obj2->SetPolygonSelection(pslct);					

doc->SetActiveObject(obj1);									//select original object
CallCommand(100004768); 										//select children
CallCommand(16768);													//connect and delete
obj1= doc->GetActiveObject();
obj1->SetName(oname);												//restore object name to original
 基本的には、選択したポリゴンを「別オブジェクトに分離」し、「一体化+消去」を実行すればいいのですが、
いろいろと問題が生じたのでかなり複雑になっています。

 発生した問題と解決法は以下の通りです。

1. 
問題、COFFEEはオブジェクトを複数選択できない。
対策、分離したオブジェクトを元オブジェクトの子オブジェクトにし、「子オブジェクトを選択」機能を使った。

2. 
問題、分離されたポリゴンが選択状態にならず、元のポリゴンが選択状態のまま残っている。
対策、元のオブジェクトの選択範囲を取り出し、全て選択解除し、元に戻した。
また分離されたポリゴンから選択範囲を取り出し、ポリゴン数を調べ、全てのポリゴンを選択し、元に戻した。

3. 
問題、「一体化+消去」を実行すると、オブジェクト名に「.1」が追加されてしまう。
対策、最初に元オブジェクトの名前を取り出し、「一体化+消去」した後のオブジェクトに戻した。


 また、現状どうしようもない問題点は以下の通りです。

1. 
問題、「別オブジェクトに分離」や「一体化+消去」機能を使っているため、スクリプト実行時にオブジェクトのIDが変ってしまう。
そのため、XPressoやMoGraph等で使っている「絶対リンク」が切れる。
対策、XPressoの場合は「相対リンク」を使って下さい。MoGraphの場合はリンクを再指定するしかありません。

2. 
問題、「取消し」を実行すると、マクロの処理が一つ一つ取り消され、一発で元の状態に戻せない。
対策、大した問題ではありません。
---

Toshio Fuji<gtofuji@gmail.com>

掲示板に書いたサンプルのまとめサイト
http://www2.11moon.com/index_as.html

tofuji
記事COLON 828
登録日時COLON 2011年3月10日(木) 10:41
お住まいCOLON 東京都渋谷区

Re: ポリゴンの複製

投稿記事 by tofuji » 2011年9月25日(日) 18:29

 「複製(Clone)」ツールを使ってポリゴンを複製するスクリプトを追加しました。

 こちらの方がずっと簡単で、問題も生じないのでこちらを使って下さい。

http://www2.11moon.com/sample_files/201 ... lygons.zip

 スクリプトの全文は以下の通りです。

コードCOLON 全て選択

var obj1= doc->GetActiveObject();
var bc1= new(BaseContainer);

bc1->SetData(MDATA_CLONE_OFFSET,0);
bc1->SetData(MDATA_CLONE_LOCALSCALE,vector(1.0,1.0,1.0));

SendModelingCommand(ID_MODELING_CLONE_TOOL,doc,obj1,bc1,MODIFY_POLYGONSELECTION);
 単に「複製」ツールを実行しているだけですが、オプションを何も指定しないと変なポリゴンができるので、
「オフセット」と「スケールのばらつき」の二つのオプションについて値を指定しています。

 特に問題はありませんが、COFFEEのマニュアルに複製ツールの扱いが全く書いてないので、動かすまでに苦労しました。
ロシアのサイトの情報を元に作ったのですが、これがなければ作れなかったと思います。
ロシアのサイトに感謝するとともに、MAXONには「これ以上COFFEEを壊すな」という点と、
「マニュアルちゃんと書け」という点を強く要求しておきたいと思います。
---

Toshio Fuji<gtofuji@gmail.com>

掲示板に書いたサンプルのまとめサイト
http://www2.11moon.com/index_as.html

kaga
記事COLON 2
登録日時COLON 2010年3月02日(火) 17:15

Re: ポリゴンの複製

投稿記事 by kaga » 2011年9月26日(月) 18:55

Clone_Selected_Polygons.zipを解凍したものだとうまくいかず、スクリプトを比べてみると

コードCOLON 全て選択

bc1->SetData(MDATA_CLONE_LOCALSCALE,vector(1.0,1.0,1.0));
の部分が抜けているようだったので、スクリプトマネージャーで全文書き換える(もしかして他にも違うかもしれないので)とうまく動作しました。

ありがとうございました。

tofuji
記事COLON 828
登録日時COLON 2011年3月10日(木) 10:41
お住まいCOLON 東京都渋谷区

Re: ポリゴンの複製

投稿記事 by tofuji » 2011年9月26日(月) 20:01

 「Clone_Selected_Polygons」スクリプトについて、作りかけのファイルをアップロードしてしまいました。どうもすみません。
 正しいファイルに差し替えておきました。

 なお、不要なのは次の1行で、

bc1->SetData(MDATA_CLONE_CNT,1);  //複製数の指定

 必要なのは、次の2行です。

bc1->SetData(MDATA_CLONE_OFFSET,0);  //オフセットの指定
bc1->SetData(MDATA_CLONE_LOCALSCALE,vector(1.0,1.0,1.0));  //スケールのばらつきの指定
---

Toshio Fuji<gtofuji@gmail.com>

掲示板に書いたサンプルのまとめサイト
http://www2.11moon.com/index_as.html

tofuji
記事COLON 828
登録日時COLON 2011年3月10日(木) 10:41
お住まいCOLON 東京都渋谷区

ポイントの複製

投稿記事 by tofuji » 2011年9月27日(火) 05:45

 おまけでポイントを複製する機能もスクリプト化しておきました。

 スクリプトファイルをダウンロードし、以下のディレクトリの中に入れて下さい。
「/Users/***your user name***/Library/Preferences/MAXON/CINEMA 4D R12_C333CB6C/library/scripts」

http://www2.11moon.com/sample_files/201 ... Points.zip

 スクリプトの全文は以下の通りで、前回のスクリプトとほとんど同じです。

コードCOLON 全て選択

var obj1= doc->GetActiveObject();
var bc1= new(BaseContainer);

bc1->SetData(MDATA_CLONE_OFFSET,0);
bc1->SetData(MDATA_CLONE_LOCALSCALE,vector(1.0,1.0,1.0));

SendModelingCommand(ID_MODELING_CLONE_TOOL,doc,obj1,bc1,MODIFY_POINTSELECTION);
---

Toshio Fuji<gtofuji@gmail.com>

掲示板に書いたサンプルのまとめサイト
http://www2.11moon.com/index_as.html

BUTTON_POST_REPLY