« 2011年1月 | トップページ | 2011年3月 »

2011年2月

2011年2月28日 (月)

べべる。

某所で 「ベベルかけると、平らな面に変な折れ目が付く」 とゴルァされておられる方がいらっしゃったのでその考察なんですね。 いや、考察というほどのもんではないですがね。 こういうことで解決しねえかなあ、俺はいつもここを気にしてるけどねー という程度の話です。


キューブをベベりました。
Bevel1
クリックででかい画像が別ウインドウに現れます。


右のキューブは、全部のエッジを選んでイッキにベベったものです。 カドに生成されたポリゴンに三角形が混じりますが、上面はキレイです。 上面は四角形ポリゴンです。 角度によっては上面に線が見えたりもするけど、メンタル霊でレンダする時はほとんど見えません。無視できるレベル。 あるいは、ベベルの分割数を増やすともっとその影響は減ります。

左のキューブは、U方向とV方向で2回に分けてべべったものです。カドのポリゴンは四角のみで構成されますが、上面は四角ポリゴンではありません。 で、汚い線が現れます。メンタル霊でレンダしてもバレバレです。ゴルァです。


どちらも、もちろん上面は100%フラットです。よじれてません。


大きな違いは、上面が四角形ポリゴンかどうかということになると思います。詳しいその原理を語れるほど理解してませんが、要はべべった結果丸まったエッジのポリゴンと、上面ポリゴンがどのようにスムージングされるかの問題だと思います。 法線表示をオンにして、法線方向を意識しながらエッジの入れ方を変更したり、俺はよくやります。 この辺はゲーム屋さんとかがむっちゃ詳しいのではなかろうか。


右のキューブのようなベベり方ができればそれで良いかもしれないけど、諸般の事情でそうも行かないことも多いはず。っていうか普通にモデリングしてると、左のキューブのような状態にした方が、スムージング以外のことで都合の良い場合が多い。



そこで左のキューブに、エッジを足しました。
Bevel2
エッジを足した結果、上面ポリゴンは四角形になりました。 変な線は消えました。 メンタル霊でレンダしても、消えています。 イエイ。


厳密に言うと、黄色いマルを付けたポリゴンで同じことが起こっているはずだと思います。ただしエリアが狭いのでバレてないだけ。 原理的にはそうだと思うんだが、どうでしょう? 詳しい人教えて下さい。

この黄色いマルのポリゴンを、さらにエッジを足して追い込んで行ってもいいと思います。 ただしそれだと細長~いポリゴンができてしまうわけで、これがまたシェーディングに悪影響を及ぼしていると思われることもあります。 なのでUV両方向に均一にエッジを足して、なるべく正方形というか、タテヨコ比率が1:1に近いポリゴンになるようにする方が良いと感じています。 そっちの方がテクスチャ的なUV作業にも都合いいし。



この話とは必ずしも関係なく、Geometry Approximation の Discontinuity に最適のスムージング閾値をくれてやるのも必須ですね。 あと、俺はいつも、カドが立って欲しい、あるいはカドが立ってもかまわない場所は有無を言わさずハードエッジをくれてやります。曖昧なままにしない。ハードなところはハード。丸いところはしっかり閾値に引っかかる角度になるよう分割を入れる。白黒はっきりさせた、漢のモデリングです。



デタラメ言ってるかもしれません。
知りません。



ごきげんよう。



.

| | コメント (2) | トラックバック (0)

2011年2月27日 (日)

グラデなビューポート。

なにやら面白そうなものをインストールしてみました。


スレッドの最初のポストにリンクがあります。便利そうなツールが置いてあります。美味しそう。
http://www.xsibase.com/forum/index.php?board=1;action=display;threadid=44503



で、この中から XSIGradient というものを試しに入れてみたのですよ。
ビューポートの背景をグラデーションにするプラグインのようです。
なんか嘔吐デスクっぽくて嫌だけど、面白そうなので入れました。


そしたらですね、XSI 様が落ちました。
32bit版の xsiaddon を WindowsXP SP3 32bit 上で稼動している 2011 SAP に入れたんですが、ビューポートにドラッグ&ドロップしたら、XSI がいきなり落ちました。

再起動してみると、Preference の中に設定は出来ていたけど、オンにしてもビューポートに変化がない。

そこでプラグインマネージャで見てみたら、赤いアイコンが付いている。つまりちゃんと XSI 様に認識されて無い(ロードされてない)んですね。 しかも C++ で書かれたらしい dll なので、中身を調べようにもありません。




ってことで、試しにプラグインの本体である XSIGradient32.dll を、 Dependency Walker というやつに食わせてみました。

俺もよくわかってないんだけど、dll をコンパイルする時に、参照しているライブラリを dll に含めるのを忘れたりすると、プログラムから呼び出される必要なコンポーネントが無いためにそのプログラムは動かない? そういう、他の dll に依存しているかどうかとかを調べるためのものなんだと思います。違う? 詳しい人教えて下さい。



ともかくも Dependency Walker に食わせたら、なにやらいくつか足りないものがあるようなことを言っている(ように見える)。 msvcr100.dll とかなんとか。 ん、この msvcrなんちゃらって、よく見るな。 XPOP2 なんかも、たしかこれを入れないと動かなかったことがあったな。 ということで msvcr100.dll をダウンロードしました。 で、このファイルを、 XSIGradient のインストール先(XSIGradient_32.dll と同じフォルダ)にぶち込んで XSI を再起動しました。


そしたらグラデになりますた (゚∀゚;;)
Xsigradient

わっ、なんか、オブジェクトビューやシェイプマネージャの中もグラデだっ


うーむ、少なくとも俺の環境では msvcr.dll というものが不足していたようです。 よくわかってないままやったのに、あっさり動いて焦りました。




で、、このグラデ背景に意味はあるんでしょうか。
今時のソフトウェアは、グラデな背景のやつ多いですよね?
単色よりグラデの方が見やすいのかな?
ま、気分が変わっていいかも知れませんね。

しばらく運用してみよう。





.

| | コメント (0) | トラックバック (0)

2011年2月26日 (土)

弐千拾弐。

今年もこの季節がやってきました。っていうかこの時期になったのはまだ2年目か。

http://area.autodesk.com/gdc2011/schedules

XSI 2012 は GDC で発表ですね。3/2にデモだそうですよ。
まだ詳細情報は見つけられてない。
今年も不毛に情報探ししよう。
目玉はなんだろう?
過去で言う ICE だとか Gator みたいな、すんげえ目玉機能はあるんだろうか。
Lagoa とか SAP の特典だった機能は、通常バージョンにも搭載されるんだろうか。
Push デフォーマ on トーラスコンパウンドとか付くんだろうか。
彼は元気にメニューの Get > 以下にいてくれるだろうか。



そんなことよりも。

今年の XSI は、どれくらい虐げられているんだろうか。
XSI の扱いの低さに、もっとも興味があります。

Maya や Max と一緒のページにも載せてもらえない最下層農奴 XSI。
Maya や Max より値段高いのに、プラグイン程度の扱いを受ける士農工商XSI。

公共のサービスも、バスもレストランも公園のベンチも、XSI だけはそれ用です。
Maya 様や Max様が通るときは、道の両側によけて、通り過ぎるまで平伏せねばなりません。
Maya 様が昼飯を召し上がる時は横で直立不動で待ってなければいけません。Maya 様が「食っていいぞ」と仰るまで食べてはいけません。
Max 様が「おい、パン買って来い」と仰ったら、即座に購買部に走らねばなりません。


それでいいのです。
どんどんいじめて下さい。
XSI は不遇のソフトウェアじゃなければいけません。
陽のあたる道を歩いてはいけません。
だって XSI ですもの。





それにしても、2011年になってまだ3ヶ月しか経たない時期に出すソフトウェアが 2012 って、いいかげんこれやめませんか。不自然ですよ。しかも現在が西暦何年なのか、一瞬迷うことも多いんですよ。毎日起動するソフトウェアですからね。起動画面で 2011 という文字をデカデカと見せつけられるわけですからね。刷り込まれちゃうんですよ。しかも 2011 SAP くんは落ちまくりやがるので、1日に何度もその画面を見るわけです。そして起動後もタイトルバーのところに 2011 って表示され続けるわけですしね。ほんとに刷り込まれます。なんのつもりですか。嘔吐デスクさん、普通に ver10 とかそういう言い方にしましょうよ。 BA Shader Collection とか見習いなさい。ver25.0 ですよ。普通にそうやって齢を重ねて行くものでしょう? 普通にバージョンに数字を加算して下さい。 でも Softimage Heisei 23 とかそういうのならいいですよ。面白いから。




.

| | コメント (6) | トラックバック (0)

2011以前でタブなスクリプトエディタ。

わっ こんなことできたんですかっ


2011 以前の XSI で、タブ付きのスクリプトエディタ。
http://www.xsibase.com/forum/index.php?board=14;action=display;threadid=44496


現在 2011 は標準でタブ付きエディタになってるのでいいのですが、以前はタブがなくて不便でした。これがエドたんを使う大きな動機にもなってました。

でも、xml ファイルをひとつ作って所定の場所に置けばできたなんて、なんでそういう重要なことを早く言わねえんだよ嘔吐デスク ゴルァ(#゚Д゚)




さっそくやってみましたよ。 上のリンク先にある Softimage のスティーブブレアさんの書き込みのまんまですが、



<?xml version="1.0" encoding="iso-8859-1"?>
<xsi_file type="RelationalView" xsi_version="8.0.249.0" syntax_version="1.1">
  <relationalview clsid="{7CE98001-243A-402D-9860-21DBB03522C5}" name="TabTabTabTab ScEd" height="310" width="479">
      <definition maxinstances="10000" acceptfocus="true" private="false" defaultsize="100,100,500,500" cmdmap="{00000000-0000-0000-0000-000000000000}" supportedtypes="6" category=""> </definition>
      <relations>
      </relations>
      <frameset orientation="horizontal" name="Frameset1" buttonsize="80,30" splitter="movable" sizechild="*">
        <switcher type="tray" buttonside="top" active="0" orientation="horizontal" name="Tray2" buttonsize="80,30" splitter="none" sizechild="*,*,*,*">
            <frameset orientation="vertical" name="1" splitter="movable" sizechild="200,*">
              <frame name="pane3" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane19" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="2" splitter="movable" sizechild="200,*">
              <frame name="pane5" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane15" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="3" splitter="movable" sizechild="200,*">
              <frame name="pane7" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane21" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="4" splitter="movable" sizechild="200,*">
              <frame name="pane9" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane12" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
        </switcher>
      </frameset>
  </relationalview>
</xsi_file>



これをテキストエディタにコピペし、
hogehoge.xsivw というファイル名で、
C:\users\あんたのユーザ名\Autodesk\Softimage_7.5\Application\Views にぶち込む。

拡張子が .xsivw でさえあれば、ファイル名は何でもいいみたい。
あと、Views フォルダがなかったので自分で作りました。


Tabbedsed

7.5 でタブ付きエディタ (o゚∀゚o)


たぶん 7.01 とかでもできるでしょう。 6 は微妙か? どうなんだろ。


3行目の name でウインドウの名前が決まるようです。ファイル名は関係ないくさい。

タブのボタンのサイズがでかすぎると思ったんですが、ファイルの中で buttonsize が 80, 30 になってるから、これを小さくすれば行けました。

        <switcher type="tray" buttonside="top" active="0" orientation="horizontal" name="Tray2" buttonsize="60,15" splitter="none" sizechild="*,*,*,*">

↑この行の方の buttonsize ですね。XSI の Layout で言うところのトレイスイッチャですね。そのサイズを指定している。


あと、4つしかタブがありませんが、これもファイルの中で4回出てくる、

            <frameset orientation="vertical" name="3" splitter="movable" sizechild="200,*">
              <frame name="pane7" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane21" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>

この部分を増やしてやれば行けました。 最初単純にコピペして10個まで増やしてみたんですが、そのままだと正常に表示されませんでした。その後、さっき出てきた行でアスタリスクが4つあることに気付き、もとは4つのタブだったのだから、これを10個にすればいいのではないかと想像してやってみたら、できました。 

        <switcher type="tray" buttonside="top" active="0" orientation="horizontal" name="Tray2" buttonsize="60,15" splitter="none" sizechild="*,*,*,*,*,*,*,*,*,*">

frame name は、ほげほげとかハゲハゲとか、テキトーに付けました。どうせ表示されるものじゃないし。

Tabbedsed2
タブの数をダイナミックに増減させることは出来なさそうですが、まあ10個もあれば十分でしょう。


↑この、ボタンが小さくて10タブのバージョンを、一応コピペしておきます。


<?xml version="1.0" encoding="iso-8859-1"?>
<xsi_file type="RelationalView" xsi_version="8.0.249.0" syntax_version="1.1">
  <relationalview clsid="{7CE98001-243A-402D-9860-21DBB03522C5}" name="TabTabTabTab ScEd" height="310" width="479">
      <definition maxinstances="10000" acceptfocus="true" private="false" defaultsize="100,100,500,500" cmdmap="{00000000-0000-0000-0000-000000000000}" supportedtypes="6" category=""> </definition>
      <relations>
      </relations>
      <frameset orientation="horizontal" name="Frameset1" buttonsize="80,30" splitter="movable" sizechild="*">
        <switcher type="tray" buttonside="top" active="0" orientation="horizontal" name="Tray2" buttonsize="60,15" splitter="none" sizechild="*,*,*,*,*,*,*,*,*,*">
            <frameset orientation="vertical" name="1" splitter="movable" sizechild="200,*">
              <frame name="pane3" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane19" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="2" splitter="movable" sizechild="200,*">
              <frame name="pane5" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane15" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="3" splitter="movable" sizechild="200,*">
              <frame name="pane7" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane21" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="4" splitter="movable" sizechild="200,*">
              <frame name="pane9" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="pane12" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="5" splitter="movable" sizechild="200,*">
              <frame name="hogehoge1" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="hagehage1" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="6" splitter="movable" sizechild="200,*">
              <frame name="hogehoge2" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="hagehage2" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="7" splitter="movable" sizechild="200,*">
              <frame name="hogehoge3" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="hagehage3" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="8" splitter="movable" sizechild="200,*">
              <frame name="hogehoge4" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="hagehage4" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="9" splitter="movable" sizechild="200,*">
              <frame name="hogehoge5" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="hagehage5" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
            <frameset orientation="vertical" name="10" splitter="movable" sizechild="200,*">
              <frame name="hogehoge6" type="Text Editor" primary="false" toolbar="own"> </frame>
              <frame name="hagehage6" type="Script History" primary="false" toolbar="own"> </frame>
            </frameset>
        </switcher>
      </frameset>
  </relationalview>
</xsi_file>




あとは、Scintilla っていうのかな、文字のハイライトやら色付けやらに対応させることはできるのかしら。どうなのかしら。 エドたんは Scintilla してます。タブも使えるので、もうエドたんがあればそれでいいじゃんとも思えるけど、唯一の問題はヘルプの表示かしら? エドたんのヘルプの表示の仕方は、標準とはちょっと違うんですよね。ヘルプ表示はやはり標準の挙動が良いからなあ。

あと残念なのは、このウインドウ(リレーショナルビュー)を閉じると、セーブしない限りスクリプトは失われてしまうということですね。これはエドたんも同じだったかな。 標準のスクリプトエディタは、ウインドウを閉じてしまってもスクリプトが保持されているじゃないですか。その感覚でウインドウを閉じてしまうと焦ります。必ずセーブしましょう。はい/いいえ/キャンセル のボタンが押せるダイアログが出てきますが、キャンセルしてもスクリプトは戻ってきません。ゴルァです。セーブするしかないです。たぶん。  だからこのエディタを使う時は、ウインドウを閉じずに畳むだけにするというクセを付けた方がいいかも。


この辺のことも考えると、七ちゃんでスクリプト書くときは標準のエディタとこのタブ付きエディタを併用するのが良さそうな気がしますね。 標準のエディタでメインのスクリプトを書き、ちょっとしたテスト用の1行コード、捨てコードなどをこのタブ付きの方で書き、必要なら標準エディタで開いているメインのスクリプトにコピペでぶち込むという感じのワークフローが、現実的かも知れません。 実際エドたんも、そんな感じで使ってた気がする。


まあともかくですよ、F1を押した時のヘルプの出方が完全に標準と同じで、かつタブを持てるというのは、意味あると思いますです。





いやあしかし、ほんと、これ知ってればこの1~2年でかなりのストレスを軽減できたはずなのに。 外部エディタやエドたんを使っていたのは、Scintilla 的な機能もそうだけど、タブがあるからというのも大きかったわけですよ。 2011 を使い始めて最初からタブ付きになっちまってから、初めてこれを知るというこの空しさよ。これってどっかマニュアルに書いてるんですか? ちゃんと大きく告知しなさいよ嘔吐デスクさんマジで。まったくもう。ぷんすかぷん。






.

| | コメント (0) | トラックバック (0)

2011年2月25日 (金)

Add to クラスタの憂鬱。

連日スクリプト書いてます。


T = Selection(0).type;
if ( T == "polySubComponent" )    //    Currently only poly clusters supported.
{
    var oSub = Selection(0).SubComponent;
    var oObj = oSub.Parent3DObject;

    var oClusters = oObj.ActivePrimitive.Geometry.Clusters.Filter( "poly" );
    if ( oClusters.count == 0 )
    {
        Logmessage( "No fuckin' clusters found on this god damn object.", siWarning );
    }
    else
    {
        //    Get a cluster to add the selected polygons to.
        //    Actually the function only returns a fullname of the cluster, not cluster object,
        //    despite the name of the variable "oTargetCluster".

        var oTargetCluster = GetTargetCluster( oClusters );   
        if ( oTargetCluster )
        {
            var oUpdatedCluster = AddToCluster( oTargetCluster + "," + oSub )(0);
            // User will be prompted when overlaps unless preference is changed.
        }
    }
}

function GetTargetCluster( oClusters )
{
    var aClusterUIItems = new Array( );
    for ( var i=0; i<oClusters.count; i++ )    //    Build array for combo menu item
    {
        var oCluster = oClusters(i);
        var ClsMatName = GetClusterMatName( oCluster );    //    Get mat name for the cluster
        ClsAndClsMatMenuItemString = oCluster.name + "     ( " + ClsMatName + " ) ";
        aClusterUIItems.push( ClsAndClsMatMenuItemString );
        aClusterUIItems.push( oCluster.fullname );
    }

    //    Build PPG

    var oP = XSIFactory.CreateObject( "CustomProperty" );
    oP.name = "";
    var oParam, oL, oItem;   
    oParam = oP.AddParameter2( "sCluster", siString, aClusterUIItems[1] );
    oL = oP.PPGLayout;
    oItem = oL.AddEnumControl( "sCluster", aClusterUIItems, "Add To", siControlCombo );

    Inspect = InspectObj( oP, null, null, siModal, false);
    if ( !Inspect )
    {
        return oP.sCluster.value;
    }
    else
    {
        return null;
    }
}

//    Find cluster material & returns its name
function GetClusterMatName( oCluster )
{
    for ( var j=0; j<oCluster.LocalProperties.count; j++ )
    {
        if ( oCluster.LocalProperties(j).IsClassOf( siMaterialID ) )
        {
            var oMat =  oCluster.LocalProperties(j);
            break;
        }
    }
    if ( oMat )
    {
        return oMat.name;
    }
    else
    {
        return "** NO MAT **";
    }
}



何をするスクリプトかと言うと、現在選択中のポリゴンを既存のクラスタに追加するスクリプトです。 ポリゴンを選んで実行すると PPG が降臨し、そのオブジェクトに既に存在するポリゴンクラスタがドロップダウンメニューに羅列されます。このドロップダウンからクラスタを選んでOKを押すと、選択していたポリゴンがそのクラスタに追加されます。 クラスタにマテリアルがあった場合は、そのマテリアル名がカッコの中に表示されます(ここ重要)。主にマテリアル付きのクラスタに新たにポリゴンを追加するという操作を想定しています。

Addtocls

そんだけです。
基本的に、ポリゴンをクラスタに追加するだけ。

そんなもん、本当は XSI 標準のワークフローでやればいいわけですが。

でも俺は、あのやり方が嫌いなんです。憂鬱になります。


  1.ポリゴン選んで、
  2.Explorer で延々と掘り進んでクラスタを発掘し、
  3.Ctrl とか押しながらクラスタを選び、
  4.すごく押しやすくできている + ボタンを押す


Explorer をほじくっているあたりからストレスが湧いてきて、Ctrl 押すあたりで脳味噌が沸騰し、最後のボタンを押す工程でモニタを破壊します。 実に憂鬱です。

 なんだよっ この小せえボタンはっ
 インターフェースのいちばんはじっこに
 嫌がらせのように配置しやがってっ
ドルァ


だってこんなボタンですよ。

↑わかりにくいですか。クリックすると大きな画像が出ます。小さくてクリックしにくいけどな!

このプラスボタンの大きさや配置はかなり激怒ものですしExplorer をほじくってクラスタを見つける過程もけっこう苦痛です。 しかもクラスタにちゃんと名前を付けてなくて Polygon1 とかになってるとどのクラスタに入れていいのか判らずいちいち横の + アイコンをクリックして展開しマテリアルの名前などを調べてるうちにさらにモニタの破壊台数が増えます。憂鬱です。しかもそうやってマテリアルの名前を確認したらやはり名前付けをサボっていたために Material1 とかのままになっており結局迷うわけですがまあそういうときはこのスクリプトであらかじめ整理しておくしかないけどともかくこのワークフローは苦痛なのです憂鬱です。

だから、Explorer をほじくったり小さいボタンを押したりする代わりに、PPG が出てきてそこから追加先のクラスタを選べれば楽かな、と思ったわけですよ。 

実際使ってみたら、はははは、笑うくらい便利じゃないか。 さすが俺様。 自分用に書いたツールほど便利なものはない。ざまーみろ嘔吐デスク。お前の母ちゃん出臍。 この文脈において嘔吐デスクに暴言を吐く妥当性は微妙ですが。



最近クラスタマテリアルを大量に扱っているんですね。 モデリングを進めながら、識別用の仮マテリアルが付いたクラスタにポリゴンをどんどんぶち込んで行くんです。1オブジェクト内にたくさんパーツ、というかポリゴンのエリアがあるんですが、そのパーツごとにマテリアルが分かれてないとパッと見で識別ができず、モデリングが進めにくいのです。 よって、モデリングが全て済んでからクラスタにマテリアルを与えるのでは意味がなく、モデリングそのものを進めやすくするためにマテリアルを与えながらやっているのです。 この過程で上記のワークフローの煩雑さにキレてモニタが何個も破壊されたので、昨日とうとう書きました。全然難しくなかった。30分くらいで書けた。早く書けば良かった。どうしてくれるんだ嘔吐デスク。




スクリプティング的な要点は・・・・別に新しいことは何もしてないですね。クラスタの取得、クラスタマテリアルの取得。さほど難しくもなければ、全く画期的でもありません。

前半、ポリゴンを選択している状態をスタートに、芋づるをしてますね。

    var oSub = Selection(0).SubComponent;
    var oObj = oSub.Parent3DObject;
    var oClusters = oObj.ActivePrimitive.Geometry.Clusters.Filter( "poly" );


この辺。


1行目。 ポリゴンからサブコンポーネントを作ります。 サブコンポーネントって? 俺もよく分かってません。分かってないけど、クラスタ扱うには必須という感じ。まずは選んでいるポリゴン(やエッジやポイント)からサブコンポーネントというものを構築しないと、その次の芋づるに行かないと感じています。


2行目。 1行目でゲットしたサブコンポーネントに対し Parent3DObject プロパティを使って、親オブジェクト( X3DObject )を取得しています。 前にゲットしたものを使って新たなものをゲットする = 芋づるです。


3行目。 2行目で取得した親オブジェクト内に存在するポリゴンクラスタを取得しています。これも芋づる。


「クラスタの取得」と言っても、実際は Clusters プロパティを使って ClusterCollection として取得してますね。クラスタのコレクション=つまり、クラスタがいくつ存在するかは置いといて、ともかくクラスタの集合体として取得していることになります。クラスタが存在してなかったら何も入りません。

さらに、コレクションに効くメソッドのひとつである Filter を使って、ポリゴンクラスタのみを残しています。これによって oClusters に入るのはポリゴンクラスタのみになります。そのオブジェクトにポイントやエッジなどのクラスタがあったとしても Filter( "poly" ) ではじかれるので、最終的に oClusters には入らないということです。 別の方法で同じことをしようとすると、種類に関係なく見つかったクラスタは全部 oClusters に入れて、それから中身をひとつずつループし、タイプを調べてポリゴンクラスタのみを取り出すという方法もアリだと思いますが、今回のように「ポリゴンのみ扱うぜ」と仕様がはっきりしている時は、こっちの方が簡単だと思います。 実行も多分速い。


こんなとこですか。


改良の余地は死ぬほどありますね。いっぱい使うので、改良します。そのうち。たぶん。 ポリゴンクラスタ以外でも使えるようにしないと。




ごきげんよう。



.

| | コメント (4) | トラックバック (0)

2011年2月24日 (木)

○。

マルですよマル
マルなプリミティブが欲しかったのです。


厚みがゼロのプリミティブ cylinder とでも言うか。
プリミティブ cylinder のフタの部分だけと言うか。
真ん中の穴が無いプリミティブ disk と言うか。
完全に平面の、ポリゴンでできた丸。
いっぱい使うじゃないですか。


今まではシリンダのフタの部分だけ取り出したりとか、めんどくさいことしてました。

これについて某所で悪態を付いたら、某さんがまた知恵を授けてくれたのです。



  シリンダの厚みゼロにして、底面のフタ無しにすりゃいいんでないの?



  Σ(゜д゜lll) Σ(゜д゜lll) Σ(゜д゜lll)


俺の頭はチタンで出来ているので、硬いのです。そういう柔軟な発想が出てこない。自分で 「厚みがゼロのシリンダとでも言うか」 なんて言っておきながら、ねえ。



やってみました。

・・・・惜しい。

厚みがゼロの場合は上面底面の頂点をウェルドというか結合してくれればいいのですが、XSI 様はそんなに親切ではありませんでした。 パッと見はちゃんと平面のマルになっているように見えるんだけど、頂点を調べてみると、上面底面の頂点がぴったり同ポジで重なって存在していました。 外周の全ての頂点がダブっているということです。 これでは使えません。

ふと思いついて FilterPoints オペレータをかましてみたら、あっさりと頂点は結合されました。

これがやりたかったんだよっ (*゚∀゚)=3



ここまで来ればこっちのもんです。あとは手順をスクリプト化するだけ。 けけけけけ。





ってことで書きたてホヤホヤのスクリプト。

//    デフォルト値をお好みで書き換え
ObjName = "maru1";
Radius = 1;
U = 12;
V = 1;
Base = 1;

//    平面シリンダ降臨 (頂点ダブって存在してるけどね)

var oCylinder = ActiveSceneRoot.AddGeometry( "Cylinder", "MeshSurface" );
oCylinder.height.value = 0;
oCylinder.closevmin.value = false;

//    シリンダにデフォルトの値をセット

oCylinder.Name = ObjName;
oCylinder.Radius.value = Radius;
oCylinder.subdivu.value = U;
oCylinder.subdivv.value = V;
oCylinder.subdivbase.value = Base;

//    FilterPoints で頂点結合

var oFilterPointsOp = ApplyTopoOp( "FilterPoints", oCylinder )(0);

//    PPG 表示して、選択状態にして、おしまい。
InspectObj( oCylinder );
Selection.Clear( );
Selection.SetAsText( oCylinder );


Maru

シリンダの状態を決めているのは、Geometry オペレータですね。プリミティブをゲットした時に自動で付いてくるオペレータです。 この中で厚みをゼロにし、底面をオフにしてます。 この時点では頂点がダブって存在する。

その後 FilterPointsByDistance オペレータで近接する頂点を結合しています。 シリンダの状態を変更しても、Geometry の計算の後に FilterPoints が必ず計算されるので、Geometry オペレータの中で厚みを持たせない限り平面のまま分割数などを変更できます。  ううむ、スヴァらしい。



いやあ、助かりました。
そのうちセルフインストール形式のプラグインにします。



これはこれとして、XSI に独自のプリミティブを作る方法はあるのかしら。
分割数や大きさなどがパラメトリックに決められる独自プリミティブということね。
どのように開発していいのか想像すらつかん。
たぶん俺には無理でしょう。
あの人とか、あの人とかが調べて書いてくれないかな。

そういえばティーポットのがあったな。あれを調べてみようかな。

.

| | コメント (2) | トラックバック (0)

2011年2月23日 (水)

悲しみのローカルシンメトリ弐。

大きなあの人が書いてくれたコードをパクって改造してみますた。




var rtn = GetKeyboardState( );
ModKey = rtn(1);

var oObjects = FilterX3D( Selection );
if ( oObjects.count != 0 )
{
    var oSymRingpulls = Ringpull285cm( oObjects, ModKey );
    SelectObj( oSymRingpulls );
}

function Ringpull285cm( oObjects, ModKey )
{
    //    If no modkey pressed = hardcoded options
    if ( ModKey == 0 )   
    {
        PivotObj = "Maman";
        xx = 1.0;
        yy = 0.0;
        zz = 0.0;
        DuplicateConstraint = true;
        ShareParent = true;
        FreezeNegativeScaling = true;
        IsRingpullTall = true;    //    Cancel flag = NOT cancelled
    }
    //    If any modkey pressed = PPG
    else
    {
        var oP = XSIFactory.CreateObject( "CustomProperty" );
        oP.name = "身長285cm";
        var oParam;
        oParam = oP.AddParameter2( "sPlane", siString, "X" );
        oParam = oP.AddParameter2( "sPivot", siString, "Parent" );
        oParam = oP.AddParameter2( "bDupConst", siBool, true );
        oParam = oP.AddParameter2( "bShareParent", siBool, true );
        oParam = oP.AddParameter2( "bFreezeNegScl", siBool, true );
       
        var oLayout, oItem;
        oL = oP.PPGLayout;
        var aItems1 = Array( "YZ (X)","X",  "XZ (Y)","Y",   "XY (Z)", "Z" );
        var aItems2 = Array( "Parent", "Parent", "Self", "Ringpull" );
        oL.AddGroup();
            oL.AddRow( );
                oItem = oL.AddEnumControl( "sPlane", aItems1, "Plane", siControlCombo );
                oItem = oL.AddEnumControl( "sPivot", aItems2, "Pivot", siControlCombo );
            oL.EndRow( );
        oL.EndGroup( );
       
        oL.AddGroup();
            oL.AddRow( );
                oL.AddGroup( "", false, 40 );
                    oItem = oL.AddItem( "bDupConst", "Duplicate Constraints" );
                oL.EndGroup( );
                oL.AddGroup( "", false, 60 );
                oL.EndGroup( );
            oL.EndRow( );

            oL.AddRow( );
                oL.AddGroup( "", false, 30 );
                oL.EndGroup( );
                oL.AddGroup( "", false, 40);
                    oItem = oL.AddItem( "bShareParent", "Share Parent" );
                oL.EndGroup( );
                oL.AddGroup( "", false, 30 );
                oL.EndGroup( );
            oL.EndRow( );

            oL.AddRow( );
                oL.AddGroup( "", false, 60 );
                oL.EndGroup( );
                oL.AddGroup( "", false, 40 );
                    oItem = oL.AddItem( "bFreezeNegScl", "Freeze Negative Scaling" );
                oL.EndGroup( );
            oL.EndRow( );
        oL.EndGroup( );   
       
        Inspect = InspectObj( oP,null, null, siModal, false );
        if ( !Inspect )
        {
            switch( oP.sPlane.value)
            {
                case "X" : xx = 1.0; yy = 0.0; zz = 0.0; break;
                case "Y" : xx = 0.0; yy = 1.0; zz = 0.0; break;
                case "Z" : xx = 0.0; yy = 0.0; zz = 1.0; break;
            }
            switch ( oP.sPivot.value )
            {
                case "Parent"    : PivotObj = "Maman"; break;
                case "Ringpull"    : PivotObj = "Ringpull"; break;
            }
            DuplicateConstraint = oP.bDupConst.value;
            ShareParent = oP.bShareParent.value;
            FreezeNegativeScaling = oP.bFreezeNegScl.value;
            IsRingpullTall = true;    //    Cancel flag = NOT cancelled
        }
        else
        {
            IsRingpullTall = false;    //    Cancel flag = Cancelled
        }
    }

    //    Do Duplicate Symmetry (Mainly stolen from Ringpull's code )
    if ( IsRingpullTall )
    {
        var oRingpulls = XSIFactory.CreateObject( "XSI.Collection" );
        for ( var i=0; i<oObjects.count; i++ )
        {
            var oObj = oObjects(i);   
            if ( PivotObj == "Maman" )
            {
                var oPivotObject = oObj.Parent;
            }
            else if ( PivotObj == "Ringpull" )
            {
                var oPivotObject = oObj;
            }
            
            var oTrans = oPivotObject.Kinematics.Global.Transform;//軸になるオブジェクトのトランフォームげっと(=親 or りんぷる)
            var vT = XSIMath.CreateVector3();
            var vR = XSIMath.CreateVector3();
            var vN = XSIMath.CreateVector3( xx, yy, zz );
            var rA = XSIMath.CreateRotation();

            oTrans.GetTranslation(vT);//選択オブジェクトの位置げっと
            oTrans.GetRotationXYZAngles(vR);//選択オブジェクトの回転げっと

            rA.SetFromXYZAngles( vR);
            vN.MulByRotationInPlace( rA);//プレーンをげっとした回転で回す

            vN.NormalizeInPlace();
            d = vT.Dot(vN);
            var oRingpull = DuplicateSymmetry( oObj, DuplicateConstraint, ShareParent, vN.x, vN.y, vN.z, d, FreezeNegativeScaling )(0);
            oRingpulls.Add( oRingpull );
        }
        return oRingpulls;
    }
}


function FilterX3D( in_Objs )
{
    var oCol = XSIFactory.CreateObject( "XSI.Collection" );
    for ( var i=0; i<in_Objs.count; i++ )
    {
        if ( in_Objs(i).IsClassOf( siX3DObjectID ) )
        {
            oCol.Add( in_Objs(i) );
        }
    }
    return oCol;
}


オブジェクト(複数可)を選んで実行します。
何も押さないで実行すると、速攻で親を軸としたXローカルなシンメトリ複製が実行されます。
Shift とか何か押して実行すると PPG が降臨してオプション指定が可能です。
一応、標準の Duplicate Symmetry のオプションは再現したつもりですが。



こちらにも Python で書かれたバージョンがあります。
http://d.hatena.ne.jp/fmt0808/20110220/1298220836
うーむ、なんか美しい感じがしますよね。わかっている/慣れている人は違う。 丁寧なコメントが付いているので Python そのものの勉強にもなります。


あとはクローンできるようにした方がいいのかな。
日々使いながら改造します。
しばらくは毎日使います。

.

| | コメント (4) | トラックバック (0)

2011年2月21日 (月)

そしてまたビール。

先日、某F社の皆様と呑む機会に恵まれましてね。


イベリコ豚のシャヴシャヴなどという、なにやら高級そうなものを出す店で、どんぐりを食べて育ったという豚さんの美味い肉をシャヴシャヴしながら、さんざんビールを呑みました。 美味かった。



で、会計の段階になったら、F社の皆様は、俺は金を払わなくてよいとおっしゃる。
社長から予算が出ているので、タダ酒になるとおっしゃる。



ここの社長さん、残念ながら今回呑み会には来れなかったのですが、その直前にF社にお邪魔してちょっと歓談させてもらったのですが、なにやらこのブログを読んでいるそうな。

えっ おごってもらっちゃっていいんですかっ
ごちそうさまです社長!(; ゚∀゚)=3


いやあ、美味い食い物とビールを頂いて、3時間くらい楽しくしゃべくって、1円もお金払わなくてよいなんて、なんて贅沢なのでしょう。俺は幸せ者です。



ということで、F社様には、
俺のスクリプト/プラグインの永久無料ライセンス Serial No.0011 を、謹んで進呈させて頂きます。


F社の皆さん、実に楽しかったです。 社長との話も興味深いものでした。 今後ともよろしくお願い申し上げます。

それと、会社訪問の際に10分ほど遅刻してしまい申し訳ありませんでした。その言い訳を今します。 約束の時間の10分前には駅に着いていました。なので余裕で間に合うはずでした。 しかし電車に乗っている間からじわりじわりと襲ってきていた便意が、電車を降りたとたん遂にその魔性を現し、俺を襲ったのです。 ということで、改札近くにあった車椅子対応な個室に閉じこもってウンコしてました! キレが悪く、時間がかかってしまったのです! その後電話して遅刻する旨を伝えた時は、さすがに初めて訪問する会社に「ウンコで遅れました!」と言うことができず、普通に「すいません、ちょっと遅れてしまいました」などと言ったのですが、美味いものをおごってもらったのに白状しないのは不誠実だと思ったので、今正直に申し上げます! ウンコで遅刻しました!

罪の告白終了。





ついでに書くようで実に恐縮ですが、先日、某からも酒をもらいましてね。秋田の日本酒でした。この某は、XSI のライセンスはおろか、Windows の PC すら持っていない奴ですが、俺に酒をくれたので、やむなくビールウェアのライセンスを発行いたします。シリアルNo.0010 な。 ありがとよ。



.

| | コメント (0) | トラックバック (0)

2011年2月18日 (金)

The Backwater Gospel。

わっ すげえ

是非フルスクリーンでどうぞ。


ええと、誰が何用に作ったのかとかまだ詳しく調べてないんだけど、なにやらデンマークの学校のプロジェクト? 学生が作ったということ? すげえ。

デザインも、色も、動きも、レイアウトも、すげえ。これは久々にぶっ飛んだ。 3D部分もスヴァらしいけど、作画の要素はもっとスヴァらしいかも。 いやあ、すげえ。



メイキング的なビデオも。

もうひとつ。

これはもう、賞賛する意外ありません。参りますた。



このブログを読むと概要がもうちょっと詳しくわかるかも。
http://www.backwatergospel.blogspot.com/
後で読もう。





物語が理解できるといいんだけどなあ。
誰か日本語字幕付けて下さい。


.

| | コメント (0) | トラックバック (0)

2011年2月17日 (木)

悲しみのローカルシンメトリ。

またもや唐突にスクリプトが発生します。






var rtn = GetKeyboardState( );
ModKey = rtn(1);

var oObjects = FilterX3D( Selection );
if ( oObjects.count != 0 )
{
    var oSyms = DupSymLocalFuckOff( oObjects );
    SelectObj( oSyms, ModKey );
}

function DupSymLocalFuckOff( oObjects, ModKey )
{
    var oSyms = XSIFactory.CreateObject( "XSI.Collection" );
    for ( var i=0; i<oObjects.count; i++ )
    {
        //    恥ずかしながら、tmp な null を降臨させる
        var oNull = ActiveSceneRoot.AddNull( "Fucker" );

        //    はばかりながら、tmp な null の SRT を、元オブジェクトの親と一致させる
        oNull.Kinematics.Global.Transform = oObjects(i).Parent.Kinematics.Global.Transform;

        //    人目を忍んで、まずはそのまんま複製する → 複製されたブツは oDup に
        if ( ModKey == 0 )
        {
            var oDup = SIDuplicate( oObjects(i) )(0);
        }
        else
        {
            var oDup = Clone( oObjects(i) )(0); // 残念なことに、Shift とか押しながらだと Clone
        }

        //    恥をしのんで、複製された oDup を、tmp な null の子供にする
        oNull.AddChild( oDup );

        //    こともあろうに、oDup を子供にした null をワールド原点に戻す
        oNull.Kinematics.Global.Transform = ActiveSceneRoot.Kinematics.Global.Transform;

       //    やけくそで、標準の DuplicateSymmetry コマンドで YZ プレーンなシンメトリ複製をする
        var oSym = DuplicateSymmetry( oDup, null, true, 1, 0, 0, 0, null)(0);
        oSyms.Add( oSym );

        //    泣きながら、シンメトリ複製後のブツを元の SRT に戻す
        oNull.Kinematics.Global.Transform = oObjects(i).Parent.Kinematics.Global.Transform;

       //    情けないことに、複製後のブツを元の親の子供に戻しておく
        oObjects(i).Parent.AddChild( oSym );

        //    誰にも気付かれないように、tmp なブツたちを消しておく
        DeleteObj( oDup );
        DeleteObj( oNull );
    }
    return oSyms;    //    何事もなかったように、複製されたブツを戻す
}

function FilterX3D( in_Objs )
{
    var oCol = XSIFactory.CreateObject( "XSI.Collection" );
    for ( var i=0; i<in_Objs.count; i++ )
    {
        if ( in_Objs(i).IsClassOf( siX3DObjectID ) )
        {
            oCol.Add( in_Objs(i) );
        }
    }
    return oCol;
}


ブツを選んで(複数可)実行します。
ローカル座標なシンメトリ複製が実行されます。X反転のみです。
ローカル=つまり自分の親に対しての X 反転になります。


XSI の Duplicate Symmetry コマンドはワールド原点を中心にしたシンメトリ複製しかしてくれないので、あまりにも悲しくて書きました。 しかし座標の変換というか計算というか、俺そういうの全くわからないので、手作業でやったことをただスクリプトにしただけというものであります。 つまり、こちらは手順を指定するだけであり、計算アルゴリズムはブラックボックスのまま XSI の機能に委ねているわけです。 これはこれでツール開発の正しいアプローチだとは思いますが、冗長なスクリプトになるし、実行遅くなりがちだし、何よりも、ちゃんとしたアルゴリズムの考察を忌避するためにやっていることなので、やはり悲しくなります。



最近このアプローチばかりで、ダメっす俺。
XSI の機能をスクリプトでどう動かすか、という所を知っているというだけであり、そもそものアルゴリズムは全くわかってないし、考えようともしない傾向にある。 刹那的であり、飛躍がありません。 光と影の挙動を理解しないまま、ともかくライトの Intensity 上げれば明るくなるんでしょー みたいな、そういうアプローチです。




まあいいんですが。

詳しい方、添削して下さい。

よろしくお願い致します。




.

| | コメント (9) | トラックバック (0)

2011年2月14日 (月)

クラスタの名前をクラスタマテリアルの名前にしてみる。

前回書いた記事ですが、タイトルがテレコとも取れるわかりにくさです。 今回のが正しいような気がするんですがどうですか。 酩酊状態だったので、何も考えずにタイトルを書いていたんだと思います。きっと八海山の生酒が大して美味くなくて不貞腐れていたのだと思います。 ま、今回タイトルはテレコになりましたが内容は同じです。 クラスタの名前を、クラスタマテリアルの名前から取ってこようというスクリプトです。


某さんの御所望で書いたようなカタチになってますが、実は俺自身がまさにこの機能を数週間前から御所望だったのです。偶然にも某さんが御所望してくれたので、いきなり書き始めたのでした。日曜の夜、しかも酩酊状態だったので、最低限しか書いてませんでした。


今日仕事で使ったら、少し不満が出てきたので書き直しました。
スクリプト起動前の選択の方法が広がりました。
ちなみに酩酊状態じゃありません。仕事中です。



//    クラスタの名前に付けたい Prefix と Postfix
//    最終的なクラスタの名前 = Prefix + マテリアル名 + Postfix

Prefix = "";
Postfix = "";

//    Expand = 恐るべき邪教の呪文
//    ノード選択・ツリー選択・ブランチ選択・グループ/レイヤ/パーティション選択が可能になる

var oCol = XSIFactory.CreateObject( "XSI.Collection" );
oCol.items = Selection;
var oTargets = oCol.Expand( );

//    まずはクラスタ全部を引っかき集める
var oClusters = XSIFactory.CreateObject( "XSI.Collection" );
oClusters.Unique = true;
for ( var i=0; i<oTargets.count; i++ )
{
    if ( oTargets(i).type == "polymsh" )
    {
        oClusters.AddItems( oTargets(i).ActivePrimitive.Geometry.Clusters );
    }
    else if ( oTargets(i).IsClassOf( siClusterID ) )
    {
        oClusters.Add( oTargets(i) );    //    クラスタそのものの選択にも対応
    }
}

//    引っかき集めたクラスタに対し本処理
for ( var i=0; i<oClusters.count; i++ )
{
    if ( oClusters(i).type == "poly" )
    {
        for ( var j=0; j<oClusters(i).LocalProperties.count; j++ )
        {
            if ( oClusters(i).LocalProperties(j).IsClassOf( siMaterialID ) )
            {
                 oClusters(i).name = Prefix + oClusters(i).LocalProperties(j).name + Postfix;
                 break;
            }
        }
    }
}


以前はオブジェクトをノード選択した状態しか想定していませんでした。 今回は Expand という呪文を使ったため、ブランチ選択していればその階層内の全部のオブジェクトが対象になります。グループ選択していれば、グループに所属する全てのオブジェクトが対象になります。 レイヤでもパーティションでも何でも来いです。 ついでにクラスタそのものを直接選択していてもいいことにしました。 また、これらの選択状態が混在していてもかまいません。

例えばシーン全体で処理したい時は、Scene_Root からブランチ/ツリー選択して実行すれば良いでしょう。


また、スクリプトの冒頭で PostfixPrefix を書き換えられるようにしておきました。 デフォルトでは "" = つまり無文字ですので何も追加されません。結果、クラスタの名前はクラスタマテリアルの名前そのものになります。 もし Prefix に "Mat_" を設定していたら、Mat_マテリアル名 という名前のクラスタになります。 Postfix に "_mat" とか設定していたら、マテリアル名_mat という名前のクラスタになります。もちろん両方指定してもかまいません。 自分の命名ルールに合わせて書き換えて使うと良いでしょう。


スクリプティング的な要点は、クラスタの取得方法がわかるということと、Expand と、LocalProperties を使っていることでしょうか。 そのうち説明するかも知れません。しないかも知れません。知りません。




なんだか少しマトモなツールになってきたように見える。酩酊から生まれたにしては上出来じゃないか。


ここに Prefix や Postfix などを決定する PPG を付けたり、前回の設定を覚えているようにしたり、マテリアルの名前から特定の文字を検索置換した後にクラスタ名に反映させるような仕組みにしたり、とかなんとか付け加えたりすると、セルフインストール型のプラグインに昇格させてビールウェアの仲間入りをしたりします。酩酊からスタートするかどうかはともかく、典型的な小ツール開発の過程です。


でもこのスクリプトをさらにいじるかどうかはわかりません。神の味噌汁です。






.

| | コメント (0) | トラックバック (0)

クラスタマテリアルの名前をクラスタの名前にしてみる。

唐突にスクリプトが始まります。

for ( var i=0; i<Selection.count; i++)
{
    var oClusters = Selection(i).ActivePrimitive.Geometry.Clusters;
    for ( var j=0; j<oClusters.count; j++ )
    {
        if ( oClusters(j).type == "poly" )
        {
            for ( var k=0; k<oClusters(j).LocalProperties.count; k++ )
            {
                if ( oClusters(j).LocalProperties(k).IsClassOf( siMaterialID ) )
                {
                     oClusters(j).name = "Mat_" + oClusters(j).LocalProperties(k).name;
                }
            }
        }
    }
}

そして唐突に終わります。 
っていうか唐突に終わらないスクリプトなんて聞いたことねえぞオルァ。



オブジェクトを選んで(複数可)実行します。
想定している挙動になっていると思うんですが、どうでしょう。
酔っ払っているのでわかりません。知りません。


ごきげんよう。


.

| | コメント (0) | トラックバック (0)

2011年2月 5日 (土)

牛乳王冠。

今まで見た Lagoa なレンダリングで一番良い。


ううむ、エロい。実にエロい。
途中、30秒目付近にいわゆるミルククラウンが出てきますね。そうか、頑張ればここまで行けるのか。



Tips はここに書かれています。
http://www.xsibase.com/forum/index.php?board=34;action=display;threadid=44242
作った本人がいくつか tips を書いています。

ポリゴナイザはマーチングキューブなアルゴリズムを使っているので、cloud の大きさがでかるなる=バウンダリボックスの大きさがでかくなるとよりメモリを食うそうです。だからカメラの外に行ったやつとか離れちゃったパーティクルを殺して、cloud の存在する領域をなるべく小さく保った方が良いそうです。 なるほど。 これは BA と同じですね。 BA も cloud がでかくなると、そして分割を数ではなくサイズで決めちゃっていると、簡単にメモリ食い尽くして真っ赤っかなレンダリングになりますからね。
パーティクルを殺すには Lagoa に付いてくる Delete by Density だっけ、それでもいいし、俺は Delete by Volume だっけ、XSI に最初から付いているやつで殺してます。 キャッシュ済みの cloud に対して殺した方が安全だそうで。ほうほう。

フレームレートを 800fps くらいまで上げたようなことが書いてますね。 Substep を上げるよりもフレームレートを上げた方が良い結果になることが多いそうで。ただしその場合 Air Density もいじってやらないといけないようなことが書いてます。

1フレに数分かかるシミュレーションも珍しくないそうで。古井戸とはそういうもんだそうで。ほうほう。 Fume とかで長時間のシミュレーションを回している話はよく聞いていたけど、Lagoa でもガチでやろうと思ったらガチで時間をかけないとダメなんでしょうかね。いやあ、経験ないからか、忍耐が効きません俺は。0.2fps くらい(=1フレ5秒くらい)でもう重いなあと思っちゃいます。


とかなんとか。




ううむ、実験したい。
しばらく Lagoa ちゃん放置プレイ中。




しかしこの piotrek marczak さん、ポーランドのワルシャワですって。
どんな国なんだろう。
やっぱり総統閣下のこと嫌いなのかなあ。



あ、レンダリングは V-Ray for XSI Beta ですって。
そういえば V-Ray どうなったんだろう。 いつものように永遠にリリースされないレンダラになっちまわないか心配です。


.

| | コメント (0) | トラックバック (0)

史上最強のデモリール。

話題のようなので。



ううむ、面接に来てください。すぐ採用します。











まずは runner からね。


| | コメント (0) | トラックバック (0)

2011年2月 1日 (火)

3DL301。

わっ 対応早っ

フリー版だとかで話題の 3Delight3 ですが、どうやらバグがあったみたいで、2011 にインストールすると XSI が起動時にコケてしまい、何もできないという現象があったみたいですね。各地で小規模なお祭りになっていました。 



でもあっという間に直しちゃったみたいですよ。
http://www.3delight.com/en/index.php?page=3DFS_download

---------------------
Hello !

We are sorry for the crashes that you encountered when using 3Delight with Softimage 2011. A new version (3.0.1) will be made available with a fix in a few hours. The crash happens only in the free version and the solutions that some user found to circumvent the bug won't work in all situations so the best thing is to wait for 3DFS 3.0.1 .

As for the problem with shaders, it is normal that some shaders using compounds or overrides do not work well with Softimage 2011. The only solution for that is to use Softimage 2011.5 as the problem and the fix lies within Softimage 2011. We are still in the process of completing support for all the shader nodes of 2011 so please keep that in mind.

Thank you,
-- aghiles
---------------------

3DL のフォーラムより転載。 XSI Base にも同じのが出てました。 開発者のアヒレスさんによる書き込みです。 「 2011 でのクラッシュに対策した 3.0.1 があと数時間でダウンロード可能になる」 と書いてます。 で、さっき行ってみたら、もう落とせました。 わあ、入れてみようかな。 でも今いじり出すと半端になるなあ・・・・。 メンタル霊チュートリアルもまだ途中だし・・・・。



なにやら今回の問題は、XSI の起動でクラッシュしてしまうのでインターフェースを立ち上げることすらできず、つまりアンインストールさえできない、しかたないから Addon フォルダまで潜っていってファイルを消し、DLL を書き戻すだかなんだか、そんなめんどくさいことをしないといけなかったみたいに見えます。 たまたま先にこれを読んでいたし、時間もなかったので、3DL はしばらく放置 しようと思っていました。 喜び勇んでインストールしてクラッシュに見舞われ苦労された方々、ご愁傷様です。


そう言えばアヒレスさん、1~2年前に俺のところにもデモしに来てくれて、その場であーだこーだと注文を出す俺に丁寧に 3DL の解説とデモをしてくれました。そこまでしてくれたのにまだ買ってなくて本当にすいませんすいません。

この人(と、数人のチーム)の音速対応は有名で、ユーザから不具合報告やリクエストがあると、数日から1週間くらいでパッチを出したりして来たようです。 売り物のソフトウェアでそこまで音速対応するって、すごいですね。 嘔吐デスクさん、見習いなさい。マジで。

にしても今回の音速対応は、音速で対応できる程度のちょっとしたミスを見逃してリリースしてしまったわけで、それもどうなのよという気分はありますがね。 レンダリングでクラッシュするのではなく、ホストアプリの起動をクラッシュさせてアンインストールさえできなくなるって、どんだけ危険なプラグインなんですかw





しかし、2コアまでのフリーライセンスって、どういうこと? 2コアマシンをいっぱい持っていれば無限にレンダリングできちゃうことにならないかね? いやまあ、ひとり1フリーライセンスまでと謳ってはいるけれど、それを防止する仕組みはもしかして無いのかな? どうなのでしょう。 どうやら Maya には以前からこういうフリーライセンスがあったように見えますね。 ちゃんと商売になるのか?

アーティストバージョンとスタジオバージョンの区別も無くなったみたい? じゃあ、フリーバージョンで RIB 書き出しもできるってことなんですよね?

それと、あれ? D.N.A ってモントリオールかどっかだと思っていたんだけど、シンガポール?



なんだかまだわからないことだらけ。 3DL ちょっと追っかけないといかんかなあ。 もう宿題増やさないでくれ。 らごあちゃんも放置プレイに入っているし、ヤヴァいです。



.

| | コメント (0) | トラックバック (0)

半額。

i3DTutorials のチュートリアルビデオ半額セールが今日終わってしまいます。
http://www.i3dtutorials.com


「今日」ってのは1月31日のことで、日本はもう2月1日ですが、たった今 i3D のサイトを見たらまだセールやってたので、あと数時間は大丈夫なのではないかと思われます。 どこの時間で31日なんでしょうかね。グリニッジはもう1日になっちゃってるから、アメリカのどっかの時間帯なんだと思うんですが。


さあ。 半額ですよ。 
1本買ったらもう1本付いてきます。 2本買ったらもう2本付いてきます。
という価格だということですよ。


俺はこのセールを使って、Rendering with SOFTIMAGE|XSI : mental ray の1と2を買いました。2つで60ドル。 安い。 安いけど・・・・。

昔、ここの ICE のチュートリアルビデオも買いました。 ICE をいじり始めたばかりの頃だったので役には立ちましたが、浅いチュートリアルだと思いました。 よくある「ほらほら、こんなこともできますよ。 簡単でしょう?」 系な感じだったので、ちと不満でした。 デフォルトの設定を使って「簡単でしょう?」と宣伝しても全く意味は無く、どこまでいじれるのか、アレを調整したい時はコレをいじれ、その背後にあるロジックはこうだ、的な解説が欲しいんですよね。

それと比べるとこのメンタル霊シリーズは、実はまだ最初の方しか見れてないんですが、進歩した感じはありました。 それなりに(完璧に、ではない)ロジックの説明をしながら進めている感じだし、XSI の不具合やその回避方法の解説も入っていたし、このパラメータはレンダリング時間に劇的に影響するので気をつけていじれとかなんとか、前よりはずいぶん丁寧に説明してくれてるなあと思いました。



ただね、ひと言で言えば、冗長。同じことを何回も言う。ジャックさん、それ、さっき言ったじゃない。 という感じ。

 「○○の理由で××になってしまう。だから■■にしましょう。その理由は○○だからです。この○○のために××になってしまうのはいただけません。だからこそ■■なんです。だって○○なんだもん」

みたいな、まあこれはかなり誇張して言っていますが、同じ解説の永久ループだなあという印象が強かった。 これいつもの i3D のパターンか。

ジャックさん、自分が上手く説明できているかどうか、自信ないんだろうな。 そして上手く言えたと思えるまで納得がいかない人なのでしょう。 自信がない時は何度も同じことを微妙に違う言い回しで繰り返し、何度か言ううちに自分で納得の行く言い方が出てきてやっとその話が終わる、みたいな、まるで俺にそっくりです Orz

それと、妙なジョークを交える独特な感じ、俺にとっては非常に邪魔です。ロボットキャラからの「おいおいジャックはん、あんたが間違えとるちゃうのん」 みたいなツッコミとか。 有料チュートリアルでそんなもん要らん要らん。 でもまあ、そこまで大した問題ではないですが。


と、いつものように不満はありつつも、未開拓の分野に分け入っていく時の足がかりには良いのではないかと思いました。俺はフォトリアル系のレンダリングはからっきし弱いので、調べようにも足がかりを見つけるまでに少し時間がかかっちゃうんですよね。だからこういうチュートリアルでカンニングするんです。 でも答えのカンニングと言うよりは勉強方法のカンニングみたいなもんですかね。このチュートリアルを見た後、急に自分に何かが出来るようになっているとは思えません。何を調べればいいのかをカンニングするという意識で俺は見ています。 ある程度やってきた人や、既に足がかりを持っている人には、不要かも知れません。


買うとダウンロードリンクに導かれます。 ZIP 圧縮したファイルを6~7個ダウンロードすることになります。回線が太いのか、なかなか速いです。 ダウンロードは1週間の期限付きで、それ以降に再びダウンロードしたい場合は、数ドルの手数料がかかるようです。 ZIP を解凍したら専用のプレイヤー EXE が入っているのでそこから見ます。 でも実は FLV ファイルを呼び出しているだけであり、FLVファイルはサブフォルダに入っています。 なので専用のインターフェースが不要なら通常のビデオプレイヤーでも見れます。 ノードロックとかではないので、ラップトップPCやら携帯機器やらで持ち歩きもできるんじゃないでしょうかね。 通勤電車で見るとか、良いかも知れない。




さああと数時間です。たぶん。
俺が買った時点では、60ドルで 5,092 円でした。
2つで 5000円ならお得感ありますね。
有田さんとか、買った方がいいんじゃねえの。




.

| | コメント (0) | トラックバック (0)

« 2011年1月 | トップページ | 2011年3月 »