_581x100.png CGsyomei_583x102.gif 訪問者 無料カウンター ページビュー 無料カウンター

2010年12月04日

ポイントキャッシュを選択したオブジェクトに追加

久々のスクリプトの勉強関連です。今やってる仕事で複数のオブジェクトにポイントキャッシュモディファイヤを追加する作業が発生していてスクリプトでやってしまおうということになったんですが意外と上手くいかなかったのでメモっておきます。

selobj = selection as array

for obj in selobj do

(

myCache = PointCache()
    addModifier obj myCache

)

自分がひっかかった点はポイントキャッシュを最初に関数として宣言してあげないといけないということでした。これはモーファーなど他のモディファイヤも同じことのようですね。

addModifierの構文は  ”addModifier ”ですが”addModifier obj PointCache()”でも”addModifier obj PointCache”でもエラーを起こしてしまいます。(なんでこうしないといけないかきちんと把握し切れてないのでそこら辺は追々^^;)
タグ:Max script
posted by けゑ at 16:36| Comment(4) | TrackBack(0) | Max Script
この記事へのコメント
どうもです。
久しぶりに拝見しました。

補足しておきす。

myCache = PointCache()

この行なんですが、
意味的には、半分あってます。
正確には、PointCache()は、コンストラクタ関数といいます。
クラス名と同じ名前の関数がコンストラクタ関数です。
クラスというのは、構造体を拡張した感じのもので、intなどと同じように型です。
クラス内では、メソッド(関数)だったり変数だったりが定義されているだけです。
なので、PointCacheだけを記述しても何もないカラの箱なので、何も起きずエラーとなります。
で、この行で何をしてるのかというと、
初期化が行われ、PointCacheというオブジェクトが作成されます。
myCahceがインスタンスになります。
インスタンスというのは、その宣言されたクラスの実体で、
これを使って変数の値を操作したりメソッドを実行したりします。
実際は、スーパークラス(元のクラス)がMODIFIERなので、
MODIFIERクラスのメソッドなども使用できます。
イメージとしては、実体を作成して、それをモディファイヤにくっつけてあげる感じです。
何か新規に作成する場合は、必ずこのようにします。スフィアを作る場合も、

s = Sphere()

でスフィアが作成され、名前の変更は、s.nameであったり、大きさその他も同様に
sというインスタンスで操作します。
既存のものを操作する場合も

sel = selection as array

などとしますが、実は、上記と同じことをしているのです。
selがインスタンスになります。

mel以外の言語は、大抵オブジェクト指向なので、
クラスやオブジェクトの概念は覚えておいた方がいいです。
melの場合は、実は、melが凄いんじゃなくてmayaのアーキテクチャが単純な階層構造だけなので、
記述しやすいってだけです。
melそれ自体は、バッチコマンドに毛が生えたようなものです。ほんとショボイっす。
すみません、勢いで長々書いてしまいました。

ちなみに、僕は、もっぱらpythonです。
最近は、自分でエフェクトを作る事が少なくなってきて、
フロー構築やツール開発など、割とTDよりな仕事が多いです。
若い人を育てたいってのもあるんですが、エフェクト関係は、なかなか難しいですね。

あ、それと、海外に就職が決まりそうとのことで、おめでとうございます。
僕も何度か考えたことがあるんですが、やっぱり日本が好きなので一歩踏み出せません。w
日本での仕事という事ではなくて、日本という国自体が好きということなんですけども。

応援してます、がんばってください。
Posted by tiesqp at 2010年12月27日 11:07
はじめまして、アメノツキのアメと申します
addModifier obj myCache
のところですが
addModifier obj (PointCache())
と書くと通ります。
Posted by ame at 2011年01月07日 16:26
確かに、アメさんのおっしゃるようにそれでもOKです。
ただそれですと、そのポイントキャッシュに対して何か行う場合、
結局ポイントキャッシュのオブジェクトをどこかで取得することになるので、
取得と作成を同時に行うことをお勧めします。
取得したインスタンスを使わないのであればそのまま放置でいいですし、
実際は、メモリ上のアドレス(4バイト)しか格納されませんので、
メモリを圧迫することもないでしょう。
Posted by tiesqp at 2011年01月12日 01:09
>tiesqpさん 非常に長いことレス返していなくてすみません。ベルリン生活が大変でかなりブログお疲れモードに入ってました。

さて非常に詳しく説明して頂いてありがとうございます。記事を書いた当時はほんと知識が通しすぎたので何が何やらという感じでしたが今は多少なりとも理解が進んで説明が分かるようになってきました。常にインスタンスを作ってその実体に対して操作するという感覚は今までなかったので新鮮でした。オブジェクトの取得と作成を先にやっておくメリットも納得です。今後色々こういう機会がある度に思い出して記述してみたいです。

>アメさん 長いこと放置してすみません^^;addModifier obj (PointCache())これでも通るのはようやく理解できました。pointcacheなどの関数は初期化されて初めて使えるようになると。ここら辺の約束事が大体分かってきました。
Posted by けゑ at 2011年07月23日 11:47
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/41964626

この記事へのトラックバック