久しぶりです。
引越しと仕事でまだバタバタしていて、家はまだ箱だらけになっております。
今日は今のプロジェクトで出てきた問題です。
ウェイトを吐き出して、読み込んで、修正して、などなどの繰り返しの作業の後に気づいたらWeight Pointsが表示されません。そして、
骨に色が付いているのにWeightMaps表示は
真っ黒です。
ウェイトを調べてみると特に問題がありませんし、普通に動きます。
色々やってみたら解決が出来たのでメモっておきます。
まずは問題の画像:

※ 仕事のデータなのでRandomizeを掛けました。
これならアベンジャーズ2のモデルだと分からないですね。
バレるとマーベル社に怒られますからね。
なんてね。
つまらない妄想を放っておいて、話に戻ります。
直し方:
ポリゴンメッシュを選んで、画面の左下のWeight Paint Panel (ブラッシュのアイコン)を開く。

左側の骨リストから骨を1個選ぶと・・・

なおりました。
こりゃ、バグだよな。
それじゃ、また。
と Schoennagel氏は自分のブログPlanetSoftimageで言っていました。
そして、Bellsey氏とRousseau氏も si-communityとxsi-base で同じことを言っていたので、
これは間違いないですね。
もう5日程前の事ですが、まだ知らない人がいるみたいなので、このブログに書いておきます。
PlanetSoftimageでSchoennagel氏はこう書きました:
As for SAP, this year there will not be a SAP version for Softimage. With the transition of development moving to Singapore the team put all their focus into the 2014 release and decided not to focus on a smaller mid-year release. I can promise you there will be some pretty impressive, BIG features in 2014 so hang in there....and as far as I know SAP releases will resume again after this year. Im really impressed with the Singapore team, some very talented people are anxious to prove themselves!!
大まかな翻訳:
シンガポールへの移転で
2014の開発に集中する為に、
今年はSAPリリースはありません。2014に驚くほど凄い新機能が追加されるのを保証します。期待して待ってください!そして、僕は知る限り、
2014年以降にSAPリリースは復帰されます。みたいなことは言っています。
正確な翻訳ではないけど、まーだいたいそんな感じです。
前向きですね。
ま、AD社員だから次のリリースは期待しないほうが良いよって書くわけないよね。
これって、良いことなのか?悪いことなのか?
良いことだと思いたいですね。
2010年と2011年の9月頃に
2011 SAP と 2012 SAP がリリースされました。
SAPは
Subscription Advantage Package という略で、サブスクリプション会員たちの為に出るマイナーリリースです。
半年後(4月頃)に新機能が加われた新しいメジャーバージョンがリリースされます。
という流れに、2年前からそうなっています。
SAPが出ることによって、2013のリリースは弱く感じてしまうかもしれません。
SAPに出した機能は新機能として見られないですね。
でもそれだけではありません。
SAPを出すために開発作業が分散され、新しいバージョンの開発が弱くなってしまう可能性もあります。
SAPはマイナーバージョンだから、前方互換機能はマストです。これもネックになってしまうかもしれませんね。
今回はSAPがない為、前方互換などに気にせずに思いっきり2014に集中が出来、4,5ヶ月の締め切りではなく10ヶ月ぐらいの長い期間はかけられるから、ちょっと期待出来るかもしれません !
がっかりさせられるかもしれません。
ん~まぁ、期待して待ちましょう。
ていうか、毎回思うんですけど、年と年数バージョンが違うのは面倒くさい!2011年に2012が出て、
話が分からなくなってしまいます。今更はもう変えられないんですけど。
以上 !
Links:
Planet Softimagehttp://area.autodesk.com/blogs/marks/siggraph-2012---calling-all-crowds
si-community
http://www.si-community.com/community/viewtopic.php?f=5&t=2603
SoftimageのGatorのウェイトコピーが結構便利ですね。
これで OBJ A のウェイトを OBJ B にコピーすることが出来ます。
しかし、OBJ B のウェイトは必ず OBJ A の骨(デフォーマー)を使ってしまいます。
これはこれで便利な時もありますが、
同じ骨構造の違うキャラクターにウェイトコピーしたい場合は
不便です。
OBJ B に Gatorでウェイトコピーして、OBJ Bのウェイトを保存して、
OBJ の エンベロープを削除して、もう一度自分の骨にエンベロープしなおします。
そして、エンベロープを掛けた後に保存したウェイトを読み込みます。
これで完了。
これは何体のプロジェクトがある時には言うまでもなく、面倒くせぇ・・・。
他に便利なやり方がありますでしょうか?
あったら教えて下さい ! 是非 ! お願いします !
Mayaのコピーウェイトは確かに、
ウェイトが入ったままでウェイト情報をコピーすることが
出来ますね。
Gatorほどパワフルではないけど、この場合にはGatorより便利です。
最近SIのプロジェクトが多くてMayaは全く触っていないな・・・。
なんでしたっけ、
あっ、はい、Gatorだな
Gatorのこのやり方しか分からないから、スクリプトですることにしました。
メインコードはGatorのログを使うので初心者でも出来るレベルのスクリプトだと思いますが、
ちょっと参考になるから書いておきます。
それに、
エンベロープオペレーターからウェイトプロパティーの取得方法を見つけたからメモっておきます。
実はイマイチよく分からないんですけど、こんな感じです:
var oObj = selection(0)
var oEnv = oObj.envelopes(0)
var EnvCls = oEnv.PortAt( 3, 0, 0).Target2
var EnvProp = oEnv.PortAt( 4, 0, 0).Target2
そう。それだけです。
これで
EnvCls = エンベロープクラスターと
EnvProp = ウェイトプロパティーは取得が出来ました。
この書き込みから覚えたやり方です
http://www.the-area.com/forum/autodesk-softimage/xsi-sdk/trouble-with-saving-out-weights/page-last/
良く分からないからまた今度ゆっくりマニュアルを読んでみます。
では、Copy Weights の
スクリプトです。
このスクリプトは2つの大きなファンクションに分かれています。
①
CopyWeights : コピーウェイト(Gatorと全く同じ)
②
ReEnvelope : エンベロープし直して、ウェイトを読み込み。
① CopyWeights だけが必要な場合「ReEnvelope」の前に // を入れるだけで済むからこの書き方にしてみました。
/*
mCopyWeights2
--------------
Copy Weights through Gator
Bones have to have the same name to work
*/
// ポリメッシュだけをとっておきましょう。
var oSel = SIFilter(selection, siPolyMeshFilter);
// 条件:「ソースにエンベロープがある・ポリゴンメッシュオブジェクトの数は2個」
if (oSel != null && oSel.Count ==2 && oSel(1).envelopes.Count == 1){
// ウェイトをコピーするファンクションを実行
CopyWeights(oSel);
// ここまではウェイトコピーされたけど、コピー元の骨のエンベロープになっています。
// 必要であれば好きな骨にエンベロープをし直して、さっきのウェイトを使います。
// 骨は同名という前提で動くファンクションです:
ReEnvelope(oSel(0));
}
else{
logmessage ("コピー先のポリゴンメッシュオブジェクト と コピー元ポリゴンメッシュオブジェクト を選択して下さい", siError)
}
//============================================
// ウェイトをコピーするファンクション
//--------------------------------------------
function CopyWeights(oSel){
// まずは変数を設定します。
// oObj = 最初に選択されたオブジェクト(コピー先)
// oSource = 最後に選択されたオブジェクト(コピー元)
var oObj = oSel(0)
var oSource = oSel(1)
// コピー先にエンベロープがあると、コピーが出来ないので、
// エンベロープが見つかったら削除しておこう
if (oObj.envelopes.count !=0) deleteobj(oObj.envelopes)
// Gatorでエンベロープをコピーして、Gatorのオペレーターをフリーズ
var GatOp = ApplyGenOp("Gator", "", oObj +";"+ oSource, 3, siPersistentOperation, siKeepGenOpInputs, null);
CopyAnimationAcrossGenerator(oObj + ".polymsh.TransferAttributes", 0, null);
FreezeObj(GatOp);
logmessage ("Envelope Copied : [" + oSource + "] --> [" + oObj +"]")
}
//============================================
// エンベロープをし直すファンクション
//--------------------------------------------
function ReEnvelope(oObj){
// oObj = コピー先。最初に選択されたオブジェクト 。
// プロジェクトフォルダを弄りたくないから、XSIのテンポラルフォルダを取得
var TempPath = XSIUtils.Environment("TEMP");
// ファイルの名前とパスを設定しておこう。
var TempPathPreset = TempPath + "\\" + oObj.name + ".Preset"
// ウェイト情報をプリセットファイルに保存する(テンポラルフォルダ)
SavePreset (oObj.envelopes(0).PortAt( 4, 0, 0 ).Target2, TempPath + "\\" + oObj.name + ".Preset");
// エンベロープを削除
deleteobj(oObj.envelopes)
// エンベロープを削除してもポイントクラスタが残ってしまうので、消しておこう。
var pntcls = selection(0).activeprimitive.geometry.clusters.filter("pnt")
if (pntcls.count > 0){
// エンベロープと関係ないポイントクラスタがあるかもしれないので、
// 消したい奴だけを探る必要があります。ポイントクラスタをループしましょう。
for ( var i=0, a = pntcls.Count; i < a; i++ ) {
// エンベロープクラスタは今タダのポイントクラスタなので見分ける方法がありません。
// 普通は「EnvelopWeightCls」という名前になっているはずなので、
// 「EnvelopWeight」から始まったら削除しよう。
if(pntcls(i).name.substring(0,13) == "EnvelopWeight") DeleteObj(pntcls(i))
// もし違う名前だったら・・・諦めるしか無い。
}
}
// 新しくエンベロープし直す。
// でもどの骨にエンベロープするのか判断できないので、ユーザーに決めてもらうように
// ピックカソル選択にしましょう:
logmessage ("エンベロープ のデフォーマー を選択して下さい", siWarning)
var rtn = PickElement( null, "Pick Bone", "Pick Bones Branch to Envelope", null, button, 0 )
var element = rtn.Value( "PickedElement" ); // これで選択された骨を取得する
var button = rtn.Value( "ButtonPressed" ); // これはただキャンセルされたかどうかが分かる為
// ピックはキャンセルされていないければ button は 0 じゃない なので、
// キャンセルしてないければ次に進もう:
if (button !=0){
// Expand() でブランチ選択された全オブジェクトをとっておこう
var oCol = XSIFactory.CreateObject('XSI.Collection');
oCol.unique = true; oCol.items = element;
var oBones = oCol.Expand();
// oObj を さっきのブランチ選択に エンベロープ を掛けましょう。
ApplyFlexEnv(oObj +";"+ oBones, null, 2)
// 最後に保存していたウェイトを読み込んで
// ここは保存した「プリセット」を「ウェイトクラスタ」にぶち込む
// デフォルトの名前になっているはずなので、クラスタ名だけで上手く行きます:
SILoadPreset( TempPath + "\\" + oObj.name + ".Preset" , oObj.envelopes(0).PortAt( 4, 0, 0 ).Target2 );
}
// FSOメソッドでウェイトのファイルを削除。一応ね。
var FSO = new ActiveXObject( "Scripting.FileSystemObject" );
FSO.DeleteFile (TempPathPreset)
}
因みにですね、ブログの解析ツールを見てたらどうやら2ちゃんから来てくださった方もいたので、2ちゃんスレッドを除いてみました。なんと、俺に対しての批判的な書き込みもありましたw
名乗らずに悪口書くのは簡単だからこの程度のクズは相手にするつもりないけどちょっと驚きましたね、さすがに。
暇でしょうけど、知らない人の悪口を書くより他にやることないのかな?
多分同じ人だと思うけど、Mayaに非破壊は要らない。皆優秀で形状を完璧に出来てからウェイトを入れるみたいなことを言ってたけど、これはちょっと笑っちゃいました。この人は本当にCGの仕事をしてるのかな?
まぁ、どうでも良いけど。
明日は多分Diablo3のサーバーはきっとまたメンテナンスになるので、今日やるしかないけど、もう飽きちゃいました。
Skyrimをやる気も出ないけど、頑張ってクリアしようかな~。
とりあず、今日は寝る。
おやすみなさい!
XSIBaseではバグ報告のスレッドがあって、あそこにこのバグがリポートされました。
COG と Symmetry でポイントをスケールすると、スケールの中心は両側の真中になるというバグです。

なぜか選択されていない右側との真中でスケールされます。
これはバグですかね。バグだとしたら、昔からあるバグですね。
昔過ぎて、もうこういうもんだと思ってました。
バグか分からないけど、不便です。めっちゃ不便です。
こんなスケールをやりたい時はないでしょう。
そうやりたかったら、両側を選択してから普通にCOGでスケールするよ。
もちろん、回転にも同じ現象が起こります:

COGは選択されているポイントの真中をピボットにするはずなので俺もバグだと思っています。
ピボットをちょっとだけ動かすと、本来のCOG+Symになります。
正しいかどうか分からないけど、俺にとってはこれは理想のCOG+Sym。


昔からこういうワークアラウンドを使っているので、もう慣れていましたが、やっぱりバグじゃない?