strange items(楽天)


shade10.5〜15用スクリプト(WINDOWS&MAC用)一覧はこちらです。


bannerst.jpg
リンク用のバナーです。
リンクはご自由にどうぞ。

2009年11月04日

shade用スクリプトその13(重複辺検出スクリプト)

新)重複辺検出20130123.txt

旧)重複辺検出120330.txt

旧)重複辺検出20110412.txt

旧)重複辺検出20100205.txt

旧)重複辺検出.txt

shade13.22にあわせて修正(2013.01.23)
shade13.01に対応(2012.03.30)
shade12.02に対応(2011.04.12)
複数の頂点を一点集中した後にマージしなかった場合、その近辺を誤って選択してしまう不具合を修正しました。ついでに処理速度も高速化しました。(2010.02.05)



今回はエラー検知用のスクリプトです。

同じ頂点から(ほぼ)同じ方向へ複数の辺が張られた場合、それらは重複している辺となってしまいます。
重複辺は目視で見つける事はほぼ不可能となっています。
長さは一緒の場合もあれば、異なる場合もあります。

重複辺001.png
上記画像では、意図的にac、ad間にもエッジを張って重複辺を二つ存在させています。

辺acと辺adは本来なら不必要な辺ですが、この「重複辺検出スクリプト」を実行すると、
重複辺002.png
と、図ではちょっとわかりにくいですが、重複辺である辺acと辺ad『のみ』が選択状態となります。
あとはユーザーがダイアログウインドウを閉じた後、delキーなどで選択状態である重複辺を削除すればいいだけです。

重複辺はshade標準のメッシュツールのdetectツールでは見つける事ができない(重複面ツールでは検出できない)ですが、重複辺スクリプトで簡単に余計な重複辺のみ選択状態にできます。


全ての重複辺を削除して、今度はai、ac、ck、ik間にエッジを張って、acikを頂点とする重複面を作ってみました。
重複辺001.png
shade標準のメッシュツールの「detect>重複面検出」では、面を構成する頂点が『全て同じ』場合でないと検出できません。
また、画像のような状態では三面稜線も生成されてるため、「detect>三面稜線検出」を行ってみると…
重複辺003.png
というように、選択できるものの、余計な箇所まで選択されてしまいます。

でも重複辺選択スクリプトを使えば、このような重複面ができた場合も、
重複辺004.png
のように重複面を構成する辺(ai、ac、ck、ik)が選択状態となりますので、ユーザーはあとはdelキーなどで削除するだけでサイズの異なる重複面を削除できます。


ただ、
重複辺005.png
のように、重複辺を一度全て消してから、ai、ic、ac間をエッジで結んだ場合、aicは重複面ではあるのですが、このような場合はこのスクリプトは全ての重複辺を選択状態にできません。
重複辺006.png
のように辺aiとacは選択状態にできるものの、icと重複している辺が存在しない(最初の状態ではif、cf間にはエッジは張られていない)ため、icは選択状態にはなりません。
(ただ、辺aiと辺acを削除すれば、重複面は消えます。)

なお、あまりないと思いますが、辺acの間に二回エッジを張ると、二つの重複辺が生成されます。(余計な重複辺acが二つ存在している)
このような場合では、スクリプトを一回実行しても選択されるacは一つのみです。
スクリプトを実行してdelキーで消した後、念のため重複辺が残っていないか何回かスクリプトをまた実行してみてください。


「delキーで選択されてる重複辺を消せばいいだけ」と書きましたが、「すでに存在している辺と『まったく同じ長さ』の重複辺がある」場合は、重複辺は選択状態になるものの、重複辺を消すと、何故か隣接する面に穴が開いてしまうようです。
重複辺007.png
ではab間に重複辺を作ってから、スクリプトで選択状態にしてdelキーで消すと…
重複辺008.png
のようにポリゴンに穴が開いてしまいます。

本来残るべき辺はきちんと残っておりますので、申し訳ないのですが、このように穴が開いた場合はshadeのメッシュツールのfaceなどで穴をふさいでください。


重複辺自体よっぽどの事がない限りは生成されないのでしょうが、もしポリゴンの面の向きをきちんと統一してたり、非平面ができてないのにレンダリング結果が不正となってる(ポリゴンの表面に辺な線が入る)場合、shade標準の重複面検出ツールなどとともに、このスクリプトを利用して、余計な重複辺や重複面の検出・削除にお役立ていただければ幸いです。

<重複面や重複辺ができるには…>
・選択した面を同位置に複製(この場合はshadeの重複面検出ツールで検知可能)
・zキーを押しながらすでにエッジが張られている頂点へまたエッジを張ってしまった。(この場合は本スクリプトで検出できます。ただし必要な辺だけきちんと残るものの、穴があく場合あり。)
・zキーを押しながら、別の頂点を介して直線的につながっている頂点とエッジを張ってしまった。(同じく本スクリプトで検出・削除可能)

なお、先に公開している「二点間にエッジを張る」スクリプトや、「マルチリンク」スクリプトなどについては、『すでにエッジが張られている箇所にはエッジを生成しない』という風にしています。
でも、「頂点を介して直線的に繋がっている点」では「すでにエッジが張られている」とは認識できないためエッジを張ってしまいます。
(重複辺検出アルゴリズムも組み込んでそういう場合もエッジを張らないようにするか検討しましたが、処理速度を稼ぐために現在は対応してません。)

そのため、「二点間にエッジを張る」スクリプトや、「マルチリンク」スクリプトなどをご使用の際には、頂点の選択状態や順番をきちんと意識しながら実行してくださいますようお願いいたします。
まぁ、間違って重複辺ができても、このスクリプトで簡単に検出、削除できますが…。(上記の例の辺icみたいな「重複してない余計な辺」はのぞく)
posted by stxsi at 17:59| shadeスクリプト | このブログの読者になる | 更新情報をチェックする