2007年12月20日

UVマップのスケールを揃える その2 modo 301

前回作ったUVRatioをさっそく使ってみたら、レイヤーをまたぐ使い方をしなくちゃならない場面が出て来た。そこでレイヤーをまたいで使えるものに変更することにした。

スクリプトを書かない人には無用の話だけど、modoのクエリで選択しているポリゴンのリストを取得する方法は2つあって、1つはレイヤー単位のクエリーで、もう一つはレイヤーに無関係ないクエリーだ。自分が常用しているのがレイヤー単位のクエリーで、

query layerservice polys ? selected

なんて書くと特定レイヤで選択されているポリゴンのリストが取得できる。じゃあその特定レイヤってのはどこで指定するのかと言うと、このクエリより前にレイヤに対して行ったクエリによって決定される。だからこのクエリを発行する前に必ずレイヤが特定できるクエリを発行する必要がある。例えば、

query layerservice layer.index ? main

みたいな感じでね。これはメインレイヤのインデックス番号を取得するクエリで、この後のレイヤーを対象にしたクエリはみんなmainレイヤに対して行われるようになる。作業は大抵メインレイヤ内で行われるのでこのシーケンスで事足りるわけだ。

modoではポリゴンはレイヤー単位で通し番号が付けられる。だから複数のレイヤーにあるポリゴンは当然同じ番号のものが存在する。だからレイヤーをまたいだ処理を実現するためにはどのレイヤ内のポリゴンなのかを識別する必要が出てくる。この処理が面倒なので大抵の場合はレイヤー個別で済ませているわけだ。

さて、レイヤーに関係なく選択ポリゴンを取得するクエリは、

query layerservice selection ? poly

だ。このクエリを発行して戻ってくる値は、

(レイヤ番号,ポリゴン番号)

という形の文字列のデータのリストになる。ポリゴン番号に加えてそのポリゴンが存在するレイヤの番号が付くので、レイヤをまたいでいても、ポリゴンを正確に特定できるってわけだ。でも、この書式のデータを受け取ってくれないクエリーやコマンドが多数存在する。だから使う時にこれらのデータを分解してレイヤ番号とポリゴン番号に分けないとならなくなったりするんだな。幸いPythonには強力な文字処理のための仕組みが付いていて、変数pstrに「(レイヤ番号,ポリゴン番号)」の文字列の形でデータが格納されている場合、

pid=pstr.strip("()").split(",")

のようにしてやれば、レイヤ番号とポリゴン番号を分離してリストの形に出来るよ。pid[0]にはレイヤー番号に相当する文字列が入り、pid[1]にはポリゴン番号に相当する文字列が入る。整数に変換したいならさらに、

pid=[ int(v) for v in pstr.strip("()").split(",") ]

なんて書き方も出来るよ。

そして、上の方で書いたけど、特定レイヤに対するクエリは、そのクエリを発行する前にレイヤを特定するためのクエリを発行しなくちゃならない。分離したレイヤ番号で、

query layerservice layer.index ? レイヤ番号

なんてクエリを発行すればOK。でも、レイヤにまたがった処理をする時には必ずこんな手間が付きまとうわけだ。だから面倒くさいのでいつもはメインレイヤだけの処理にしちゃってるわけだ。

でも、今回はレイヤ間でも比率を合わせたい場合が出てきたので、上記の仕組みを取り入れて改良したってわけだ。

UVRatio

こんな感じで複数のレイヤにまたがっていても処理できるようになったよ。他のスクリプトも上記の事を踏まえて改造すれば複数レイヤに対応出来ると思うよ。

それではまた次回。

スクリプトまとめページ( Down Load はこちらから)  

カテゴリー別ページ

modo操作メモ 



take_z_ultima at 12:46│Comments(0)TrackBack(0)modo | CG

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 

Archives