ポリゴンの複製

CINEMA 4DおよびBodyPaint 3Dに関する一般的な議論や情報交換をするフォーラムです。

ポリゴンの複製

投稿記事by tofuji » 日 9 25, 2011 11:24 am

 こんにちは冨士です。

 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/20110925/Duplicate_Selected_Polygons.zip

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

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

コード: 全て選択
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
 
記事: 803
登録日時: 木 3 10, 2011 10:41 am
お住まい: 東京都渋谷区

Re: ポリゴンの複製

投稿記事by tofuji » 日 9 25, 2011 6:29 pm

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

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

http://www2.11moon.com/sample_files/20110925/Clone_Selected_Polygons.zip

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

コード: 全て選択
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
tofuji
 
記事: 803
登録日時: 木 3 10, 2011 10:41 am
お住まい: 東京都渋谷区

Re: ポリゴンの複製

投稿記事by kaga » 月 9 26, 2011 6:55 pm

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

コード: 全て選択
bc1->SetData(MDATA_CLONE_LOCALSCALE,vector(1.0,1.0,1.0));


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

ありがとうございました。
kaga
 
記事: 2
登録日時: 火 3 02, 2010 5:15 pm

Re: ポリゴンの複製

投稿記事by tofuji » 月 9 26, 2011 8:01 pm

 「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
 
記事: 803
登録日時: 木 3 10, 2011 10:41 am
お住まい: 東京都渋谷区

ポイントの複製

投稿記事by tofuji » 火 9 27, 2011 5:45 am

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

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

http://www2.11moon.com/sample_files/20110925/Clone_Selected_Points.zip

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

コード: 全て選択
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
tofuji
 
記事: 803
登録日時: 木 3 10, 2011 10:41 am
お住まい: 東京都渋谷区


Return to ユーザフォーラム

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[2人]