2012年2月24日金曜日

Softimage Original Plugin Dev : ttSelectSimilarAngle

UVを塊で整列させようとして、はや一年近くたってるのですが、
なかなか上手くいきません


プログラマーさんにとりあえずIslandの処理を教えてもらいましたので
解析 & 勉強中です。

といっても昼休みに1時間ずつしかしてませんので
進捗も微々たる物です


とりあえず難易度を下げて、
隣接するポリゴンで角度の少ないものを選択するプラグインを作ってみました

アルゴリズムとしては、
近接したポリゴンを算出、角度を比較、
一定以内だと選択するグループに追加、
と簡単なものですが、C++で組むのには骨が折れます




手探りで作ったものなのでコードもひどいものです orz
もう少し整理したら 後悔w しようかと思います


画面のような製作法だと、
無駄なラインが増えてしまうのが難点です
それをクリーンナップするために
コレはコレで欲しかったツールなので、
良かったかもしれません



メモ

・ttSelectSimilarAngle
・DissolveComponent
・CleanUP2Point
のコンボで、高速にポリゴンを綺麗にできる


うーん、これも、グループごとにClusterとして分けられれば、
便利かもなぁ。

とりあえずグループ分けのアルゴリズムはどこでも必要そうです

2012年2月21日火曜日

Softimage C++ : Select Polygons

C++でインデックスからポリゴンの選択が
できてない事に気づいたΣ(°□°;)


というわけで、ここ1週間、ポリゴンの選択について悩んでました

なかなかにC++楽しませてくれます orz
結果として一度テキストデーターにしてます。

もっとスマートな方法があるかも

他の方法があれば教えてやってください。


Select Polygons

以下コードの抜粋

 Application app;

 //選択したオブジェクト
 Selection oSel(app.GetSelection());

 //X3DObject‚にキャスト
 X3DObject oObj(oSel[0]);
 app.LogMessage(L"SelectObject = " + CValue(oObj.GetFullName()).GetAsText());

 //メッシュを取得
 PolygonMesh oMesh( oObj.GetActivePrimitive().GetGeometry() );
 CPolygonFaceRefArray oPolygons(oMesh.GetPolygons());

 //選択を解除
 oSel.Clear();

//--------------------------------------------------------------
//
//選択する頂点のアレイを用意
//
//--------------------------------------------------------------

 //とりあえず、頂点のアレイを作成‚ [0,1,3]
 int const alength = 3;
 long IndexArray[alength];
 IndexArray[0] = 0;
 IndexArray[1] = 1;
 IndexArray[2] = 3;


//--------------------------------------------------------------
//
//選択する文字列を作成
//
//--------------------------------------------------------------

A.CLongArrayで頂点の配列から、テキストデーターを取得
 CLongArray aIndex;
 for (int i = 0; i < alength; i++){
  CRef ref(oPolygons[IndexArray[i]]);
  aIndex.Add(PolygonFace(ref).GetIndex());
 }
 app.LogMessage(CString(aIndex.GetAsText()));
 CString strSelect(aIndex.GetAsText());


B.テキストを直接作成する方法
 CString strSelect = L"";
 for (int i = 0; i < alength; i++){
  //最後の "," が不要なので場合分け
  if(i == alength - 1)
   strSelect += CString( (CValue(IndexArray[i]).GetAsText() )       );
  else
   strSelect += CString( (CValue(IndexArray[i]).GetAsText() ) + L",");
 }


//--------------------------------------------------------------
//
//文字列からポリゴンを選択
//
//--------------------------------------------------------------

A.新規選択の場合SetAsText‚でOK
 oSel.SetAsText(CString(oObj.GetFullName()) + L".poly[ " + strSelect + L"]");


B.追加選択等の場合はStringsを CRefに設定する必要がある
 CRef ref;
 ref.Set(CString(oObj.GetFullName()) + L".poly[ " + strSelect + L"]");

 //選択
 oSel.Add(ref);


うーん、一度SubComponentとかにすればいい気もするけど、
それを作るなら、結局の所、テキストデーターで直打ちでも・・・

なにかしら、定石があれば知りたいです


追記

選択はB.の一度CRefに変換した方が良いみたい。
(選択状態がポリゴンに変更された)

また、[0,1,2,3,3]などで、3が重複した場合は、
選択が解除されるので注意が必要、
選択>選択解除 のトグルなのかな?
地味にハマりました orz

2012年2月17日金曜日

Softimage Script : SeparateSelCluster

ツイッターで、クラスターを分離するスクリプトの話題が上がったので、
以前作った物をUPしてみたのですが、
人に見せるコードではないですね orz
自分ですらわかりません。

最近は、自スクリプトのメンテもするようになってきましたので
これは意識して修正をして行かねばなりませんね


SelarateSelCluster


選択したクラスターを分離して新しいオブジェクトにするスクリプト

#-----------------------------------------------------------------------
#SeparateSelCluster
#選択したクラスタを分離、マテリアルを適用

#使用法
#クラスタを選択実行

#履歴
# v1.0 完成

from win32com.client import constants as c
app = Application;log = app.Logmessage
import re
  
#-----------------------------------------------------------------------
# Main
#-----------------------------------------------------------------------
def main():

 #クラスターを確認
 oSel = app.Selection(0)
 if oSel.Type != "poly":
  log("Select Poly Cluster")
  return 0


 oCls = oSel
 oObj = oSel.Parent3DObject
 oGeo = oObj.ActivePrimitive.Geometry
 
 #ポリゴンのインデックスを-1で初期化[-1,-1,-1]
 aIndex = oGeo.Polygons.IndexArray  
 a = []
 for i in aIndex:
  a.append(-1)

 for i,v in enumerate(oCls.FindIndices(aIndex)):
  if v != -1:
   a[i] = 1
 extIndex = []

 for i,v in enumerate(a):
  if v == 1:
   extIndex.append(i)

 subset = extIndex
 oSub = oGeo.Polygons.SubComponent
 oSub.ElementArray = subset
 app.SelectObj(oSub)

 op = app.ExtractFromComponents("ExtractPolygonsOp", oSub, oObj.Name + "_" + oSel.Name, True, "siImmediateOperation", "siKeepGenOpInputs", "")
 newObj = op(0)(0)
 app.DeleteObj(oCls)

 oCls = newObj.ActivePrimitive.Geometry.Clusters
 for i in oCls:
  if i.Type == "polygon":
   newObj.SetMaterial(oCls.Material)
   app.DeleteObj(oCls)

 #親子付けをする
 #バグ報告アリガトウございますです。ちょっとOffっておきます〜
 #app.ParentObj(oObj.Parent3DObject,newObj)
 
 return 1

main()
#-----------------------------------------------------------------------


使用の際の不具合の責は負いませんぜ
バグ報告は歓迎します (≧▽≦)ゞ

2012年2月15日水曜日

Memo : MayaPlugin : DiamantTools for Maya

DiamantTools for Maya

SoftimageじゃないですがToolとしてメモ
ディアブロで有名なBlizzard社
RichDiamant 氏の Tool らしいです。

なんで公開したのΣ(°□°;)


ざっと機能を拝見。
ツールとしてはModo,3DCoatの機能を、MAYAに移植と言う感じです


他のToolで、安く補えば良い、
と言う考え方もありだとは思うのですが、
やはり、Import,Export の手間、
Tool間の使い方の覚え直し、の手間を考えると
メインの Tool 単体ですませてしまいたい物です。

というか、うらやましい〜www

Softimage Plugin : QuickPrimitive



自分が個人的に尊敬してるプラグイン制作者 piotrek 氏の新しい Plugin です。

任意の場所から、法線を参照しつつ、プリミティブを作成できます
これはすごいいい!

SIのモデリングツールが一番弱いと感じられるのは、
新しいプリミティブが、任意の位置に出てこない事が一番だと思います
グローバルのセンターにしか出ないんですよね orz

これ、背景には辛い仕様だったりするんです。
だって、センターから遥か離れた所にどうやってプリミティブを置くの、
窓とかどうするの?
と言う所でいつもぐんにゃりする訳です。

一つ出しておいてコピーとかしますけどね、
作業自体は直感で勧めたいじゃないですか

それが一気に解決!!!


というか、コレが欲しくてC++とOpenGLを勉強してたんだけど(滝汗 
いつ出来るかもわからないし(泣

というわけで、使わせてもらうっす〜

si-community


勉強用にソースもくれないかしら_(:p) ∠)_
(以前のツールはソースも公開してくれた)

2012年2月14日火曜日

ZBrush : Anatomy : ZBrushWorkshops w Ryan




Ryan氏のYoutubeチャンネルから、解剖学



筋肉がどのように収縮し、複雑な人間の動きを作るかは、
調べれば調べるほど、良く出来ている構造に感動します。

正に神の領域、造形ですな〜。


観察眼のレベル


海外に留学しておられる人と話して気づいたのですが、
やはり、解剖学を学んだ方のレベルは、差が大きいと思ったり

なんというか、専門性のレベルが違うんですよね〜。
観察眼が、一つか、二つ上のレベルです。

多分日本でも美術を習ってる人が、ZBrushとか使うと凄いんだろうなぁと思うんですが。


自分もう少し取り組んで、
背筋と骨盤のアタリのエロ肉と、
尻えくぼを研究したいと思います

2012年2月9日木曜日

Anatomy : TEAMLAB BODY bata

うぉおおおおおー、チェックだぜ。
TEAMLAB BODY bata
 だいぶ筋肉は勉強したんだけど、絵に落とし込めてない。
それどころかデッサンも続けられてない。


C++である程度SIのToolが作れるようになったら、
お絵描き再会するんだ!(希望
でもUnityで作ってあるんだなコレ_(:p) ∠)_

SoftimagePlugin : ZBrush FiberMesh to strands compound

ZBrushが大人になった(毛が生えた)訳ですが、その毛をSIにインポート可能になりました。
・・・普通にMeshとしては以前から読み込めるんですね(汗

SI-Communityより
ZBrush FiberMesh to strands compound

FiberMeshの使い方

OrkさんのNewsで確認
Ork News


Softimage へ Import


ZBrush から Obj 形式で FiberMesh を Export


Softimage に Import


空のPointCloudを作成
ICETreeを適用し、DownLoad したコンパウンドを接続
うまー


そもそも FiberMeshって、板ポリがベースなのね~
コレはコレで使い道はあるかもしれませんな

その板ポリからICEでセグメントを発生させてるみたい
ですので、ZBrushで指定したセグメントと数をそろえないと爆発します

2012年2月2日木曜日

Softimage tips : CameraProjection Moderlng

どうも、また忙しくなってきたので更新の頻度が落ちてます。

昼休みなど空いた時間を使って実験を行うのですが、
最近はC++でプラグインを作るために四苦八苦してます。

時間の割には成果の少ないC++ orz

で、最近思いついたネタなんですが、ちょっと紹介


CameraProjection Modeling

よく写真を元にモデリングをするのに、ロトスコープを使ってたのですが、
なかなか制御できないし、いろいろ面倒
かといって、通常のプロジェクションだとオブジェクトをフリーズできない。
(swimはあるけど)

ということでプロジェクション用のカメラを追加して、
それで操作しちゃえばいいことに気づいた
慣れたカメラなら、操作は楽だし、
マテリアルとカメラプロジェクションを同じカメラで設定すれば
ほかのオブジェクトも追加可能、
画角も設定できるし、かんたんじゃない?


というわけで、簡単に設定できて、破棄できる、
最近お気に入りの手法です。

カメラプロジェクションを使ったことある人はすぐ気づくんだろうけどなーーー orz