スクリプトで頂点番号をビューポートに表示させる(3dsMAX)


今回はmaxscriptです。
別のツールを作ってるときに
3dsMAXで頂点番号調べるにはどうしたらいいんだ・・・・?
と思ってぐぐって見た結果見つけたのが尊敬する大翔士さんのこのツイート。

どうも、標準機能ではかんたんに見られる術はなさそう。
上記ツイートのツリーに大翔士さんが作ったサンプルのURLが記載されていたのですが、なにせ5年前のツイート。
ファイルはなくなっていました。

こうなったら自分で書くしかない!

ということで頑張って書いてみました。

displayVertexNumber.ms
o=$selection as array --選択オブジェクトを配列oに代入--

unregisterRedrawViewsCallback GW_displayVertexNumber --コールバック関数を解除--
fn GW_displayVertexNumber =
(
    for i = 1 to o.count do --選択オブジェクトの数だけ繰り返し
    (
        theMesh = snapshotAsMesh o[i]  --配列oのi番目にあるデータをメッシュに変換して「theMesh」としてメモリに乗せる--
        theVertCount = theMesh.numverts  --「theMesh」の頂点数をカウント--

        for v = 1 to theVertCount do  --「v」の1番目から、カウントした頂点数分繰り返し--
        (
            gw.setTransform (matrix3 1)  --3次元空間を2次元空間に変換--
            thePos = (getVert theMesh v)  --v番目の頂点の座標を「thePos」に代入--
            gw.text thePos (v as string) color:yellow  --V番目の頂点の位置に、頂点番号を黄色で表示--
        )
    )
    gw.enlargeUpdateRect #whole  --描画領域の拡張--
)
registerRedrawViewsCallback GW_displayVertexNumber --コールバック関数を登録--

中身としては下記のmaxscriptヘルプのサンプルの改変です。
http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_1B088FF0_6A36_420E_9F37_F0DBE9FB2676_htm
http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_853014AC_9DC8_4F5C_B14B_3643E5925AD8_htm
※こちらも大翔士さんのツイートで紹介されています。

そもそものMaxscriptによるビューポート再描画メソッドが「gw.~」の部分で、これを利用するために、

registerRedrawViewsCallback <fn>
unRegisterRedrawViewsCallback <fn>

で関数を登録(または解除)しないといけないようです。
重複を避けるために、最初にunregisterして、最後にregisteで登録します。

全体としては関数を登録しているだけなので、頂点番号の表示を消したいときは

unregisterRedrawViewsCallback GW_displayVertexNumber --コールバック関数を解除--

で関数の登録を解除してあげればOKです。