2008年04月30日

スクリプトからUVマップを扱う その3 modo 302

UV座標値の取得

ポイント名さえ取得出来ちゃえばクエリでUV座標を得るのは簡単だ。

query layerservice uv.pos ? ポイントセレクタ

これも調べたいポイントのレイヤーとUVマップを指定する部分が無いので、このクエリを実行する前にそれらについて何らかのクエリをしてデフォルトとして選択しておく必要がある。まあポイント名を取得する時点で既にその作業は済んでることが多いけどね。

ポリゴンインデックスとポイントインデックスを分離していたら改めて( )付きで再構成してセレクタにしなくちゃならないのでこんな書きかたになる。

uv=lx.eval("query layerservice uv.pos ? (%s,%s)" % (poly,vert))

UVSで取得したままならそのままセレクタとして使えばいいだけだ。連続UVポイントの場合はポリゴンインデックスは−1になる。

uv=lx.eval("query layerservice uv.pos ? %s" % uvpoint)

返って来るのはUV座標値の入ったタプルだ。


不連続UVエッジの取得(不連続UVエッジ選択の補足)

前に書いたようにどの不連続エッジが選択されているかを直接調べるクエリは無いようだ。そこでエッジ選択から頂点選択に変換するわけだけど、これにもちょっと問題がある。同じ位置にある不連続UVポイントも選択されてしまう事だ(しかもたまに選択されない場合がある)。それが巻き起こす弊害はこんな感じ。

fig01こんな感じに不連続エッジが選ばれている場合、これをポイント選択に変換すると・・・

fig02こういう感じで同位置にある不連続UVポイントは全選択されてしまう。選択されたエッジとエッジに挟まれたエッジの両端の不連続UVポイントが隣のエッジの不連続UVポイントと同じ位置にあるために一緒に選択されてしまうわけだ。それを再びエッジ選択に変換すると・・・

fig03このように間のエッジも選択されてしまう。

fig04余分な不連続UVポイントを選ばず、間のポリゴンに付いている不連続UVポイントを選択しないで両側のポリゴンに付いているUVポイントのみ選択すれば・・・

fig05このように元に戻る。

fig06しかしこの方法でもどうにもならない場合もある。1つのポリゴン内でとびとびに選択していた場合は、ポリゴンで分離することは出来ない。

fig07余分な不連続UVポイント無しに選択したとしても・・・

fig08エッジに変換すると全部繋がってしまう。これは今のところ諦めるしか無いかなぁ・・・。

とまあ、こんな感じなので選択次第でいろいろな問題が起きそうなんだけど、一応エッジの選択状態について調べる方法を考えてみた。

で、思いついたのは選択されているエッジを先に取得して、そのエッジを含むポリゴンを取得して、変換して得た不連続UVポイントとつき合わせて比較して有効なポイントだけ抽出する方法だ。以下の方法で現在選択されている不連続UVエッジが変数seledgeに(polygon , edge)という形のリストとして得られる。

edges=lx.evalN("query layerservice edges ? selected")
lx.eval("select.convert vertex")
uvs=[s.strip("()").split(",") for s in lx.evalN("query layerservice uvs ? selected")]
uvdic={}
for uv in uvs:
    if uvdic.has_key(uv[0]):
        uvdic[uv[0]].append(uv[1])
    else:
        uvdic[uv[0]]=[uv[1]]
seledge=[]
for e in edges:
    epolys=lx.evalN("query layerservice edge.polyList ? %s" % e)
    for p in epolys:
        if uvdic.has_key(str(p)):
            vid=e.strip("()").split(",")
            uvlist=uvdic[str(p)]
            if vid[0] in uvlist and vid[1] in uvlist:
                seledge.append((p,e))
lx.out(seledge)

fig09この方法でも左の画像のような選択状態になっている場合は無理だな。矢印で示したエッジは選択されていないにも係わらず選択されたエッジとして取得されちゃう。不連続エッジとしては選択されていないけど通常のエッジとしては選択されているし、両側のポイントはエッジから変換した時に選択状態になっちゃうしね。これはお手上げだな。



それではまた次回。

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

カテゴリー別ページ



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

トラックバックURL

この記事にコメントする

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

Archives