画力がないなら立体を作ればいい

3DCGでワンシーンメイキング(オリジナル小説の挿絵作り)

サブツールと回転情報との紐付けの検討(いけるかもしれない)

(約 4,200文字の記事です。)
f:id:yamato-tsukasa:20190130034308j:plain
前回はチェンジザワールド軸モードの大幅な機能向上(トランスポーズマスターのエラー事前スキャン)に加え、今回はBTCの大幅な機能向上。ついにメモリとファイルとのデータのやりとりが実現。これにより回転情報を外部に保存したり、外部から読み込むことが出来るようになった。応用範囲が一気に広がる。バックアップも完璧なのでZbrush落ちも気にしなくて言い。詳しくはこちら
今回「も」BTC関連の日記です。昨晩は寝た記憶が無いような。

さて、前回も完璧だと思ってリリースし、こんな機能が欲しいという要望があって、確かにそうだと思ったので、今回に至る。今回も、もう完璧だ!と思ってリリースしたのだが、こんな風になって欲しいとの要望があって、確かにそう思ってしまった。

そう思ってしまったのである。

サブツールと回転情報とを紐付けられない?

なんとも無茶な!と、最初は思った。だが色々情報交換しているうちに、アイディアがひらめいた。ひらめいてしまったのだ。ただし条件が一つある。

サブツールのファイル名が、他のサブツールとかぶらない「唯一のファイル名であること」これが前提である。

もちろん、そうでないときのエラー処理も実装することになるわけだが、α版としては、その前提が保たれる上での実装になるはずだ。

なんで名前が唯一でないといけないのか?

サブツールが唯一でないと、データベース上に保持した回転情報が迷子になるからだ。サブツールと回転情報は一対一で紐付けられていなければならない。なので、サブツール名の部分一致では重複する可能性がある。なので、実装当時にはまず「ファイル名がフルで完全一致」を前提としたい。

リネーム問題

Zscriptは、実はサブツール名を操作できない。読み取ることは出来ても、書き込むことも変更することも出来ない。これが悩ましい。もし操作できるならIDをファイル名の前後にくっつけて終わりなのにね。それが出来ないから、ユーザーにファイル名の唯一性を確保してもらう必要がある。美しくない。だがしょうがない。

そんな美学よりも、サブツールと回転情報等の紐付けを望む人の方が多いのだろう。実際、Zbrushではサブツールの名前重複は回復不能なエラーを導く可能性があるため、ある程度のユーザーならば意識的に避けているはずだ、という希望的観測に基づく。あまり美しくない。だが仕方が無い。Zscriptはプログラミング言語としては非常にもろい。クッキーくらいもろい気がする(笑)

確かに現在のVer.2.2.1までは堅牢な作りだ。コンクリート並みに固い。だがそれ故に限界がある。そこで今回は「ユーザーによる名前の一意性」を前提とした上で、サブツールと回転情報とをデータベース上で紐付けてみたい。

サブツールの並び順問題

実は、サブツールは、上からの並び順でIDが振られる。なので、並び順をCTRL+上下矢印ボタンで変えると、IDがコロコロ変わる。なので、厳密にはIDでもなんでもなく、文字通り、上から何番目のレイヤー、みたいなものなのだ、悩ましい。

そうなると、どうやってサブツールを唯一見分けるのか。最初のテーマに戻る。そう、名前なのだ、これしかない。だから名前の唯一性だけが唯一の命綱。それをユーザーに預けるのは心苦しいが、他に手段がない。これがサブツールと回転情報とを紐付けることが非常に難しい理由だ。

サブツールの名前変更とIDとを常に追跡する

幸い、現在選択中のサブツールの並び順は関数で取得できる。「既に付けられた」サブツールの名前も取得可能だ(だがはっきり言ってとても面倒くさい)。
問題は2つある。1つじゃなくて「2つ」というのが、非常に厄介なのだ2の2乗=4倍に厄介度が膨れ上がるからだ。

並び順はユーザーによってコロコロ変えられる

これは上述したとおり。しかし、作業を考えると並び替えるな、というのは不可能だ。ツールがユーザーを拘束してはいけない。

サブツール名もユーザーによってコロコロ変えられる

同上。変えるなと言うのも難しい。

重要なのは「作成当時の唯一性」と「唯一性のキープ」メンテナンス

ここで一つだけ救いがある。サブツールで初めてBTCで角度情報を取得する瞬間だ。この際に全サブツールをスキャンすれば、現在選択中のサブツール名が唯一かどうかを判定できる。エラーウィンドウを出してリネームを強いてもいいだろう。これでとりあえず名前の唯一性は確保できる。

名前が唯一になれば、その後に取得された回転情報はその名前に紐付け可能だ。とりあえず第一の峠クリア。

次に、サブツールの並び順だ。どこかでDupicateされればあっという間に上からの並び順が変わる。これは避けられないだろう。
だが名前が唯一なのでリンクは切れない。ここまではいい。

ユーザーがBTC後にリネームしたらどうなるの?

これが第二の山場だ。リネームするなと言うのは難しい。ユーザーとしては、リネームしても唯一性が保たれていればいいでしょ?と思うだろう。だがそんなに簡単にはいかない。
名前こそが回転情報とサブツールとをつなぐ唯一の命綱。それがリネームであっさり切れる。回転情報は迷子になると二度と戻ってこられない。これを回避したい。

BTCツールがリネーム前後の名前を追跡できればいい

例えばZbrush純正のリネームボタンならばお手上げだ。BTCはその前後の変化を知る術がない。だが、BTCのプラグインを経由して純正リネーム機能を呼び出すのであれば、リネーム前後の名前情報を取得できる。そうすると、名前情報を書き換えることで新しい名前と回転情報を引き続き紐付け可能だ。

リネーム前後でスクリプトが連続動作可能なことは、BTCのバックアップサブツールの動作で確認済みだ。なので、それを応用すれば、

  1. リネーム前のサブツール名を取得
  2. 純正リネームコマンドを呼ぶ
  3. リネーム後のサブツール名を取得
  4. データベース内の新旧の名前情報を入れ替える

これでいけそうではないか。
もちろんリネーム後の名前が唯一性を確保していることをユーザーに保証してもらってこそ成り立つ技だが、今回はそれを前提とするほかない。逆に言うと、ユーザーはそれにさえ気を付けていれば、BTCリネームツール経由で普通にサブツールをリネームできるわけだから、創作活動の足かせには全くならない。ホットキーを割り当ててもらえば全然使用感に影響がない。素晴らしい。(予定)

あら?サブツールと回転情報との紐付け、できそうじゃない?


もし実現できた場合の夢物語はこんな感じ。

  1. サブツール選択する
  2. BTCを実行してメモリに回転情報を記録
  3. 好きなタイミングでLocal to World実行。原点に戻す
  4. 対称編集したらW to Lで元の位置に戻す
  5. 並び順を変える
  6. L to W時にDBスキャンして名前をもとにサブツールの並び順情報を更新。正しい回転情報を取得してL to W実行
  7. 対称編集したらW to Lで元の位置に戻す
  8. 名前を変えたい
  9. BTCのリネームツールをホットキーで呼び出してリネーム(ただし唯一性は確保のこと)
  10. DB内の名前情報を差し替え(このとき他に同名が無いかスキャンしてエラー表示等も可能)
  11. 名前の差し替え完了

これで、サブツールの並び替え問題と、リネーム問題は解決できた。ということは、理論上は実装可能である。
後は名前の取り出し・比較、データーベースの更新の実装や、データーベースの確保方法などだが、なんとかなるだろう。手段は1つずつくらいはありそうだ。バグの可能性は果てしない。気が遠くなる。だが不可能ではない。

ん?サブツールの並び順、関係なくね?

と思ってしまった。名前が唯一なら、名前と回転情報とをデータベース上で維持できればいいよね?並び順なんてどうでもよくね?……確かにそうだ。変な先入観に囚われていたのかもしれない。

重要なのはサブツールの並び順ではなくて、メモリ内の回転情報の保存場所の位置だな。これは一度記憶すると基本的には固定なので。なので、名前と、回転情報アドレスと、の対応付けだな。

いやいや、利用価値はある

例えば、IDと名前とが一致すれば名前の唯一性のスキャンをスキップすることで高速化が図れる。やはり並び順IDは利用価値があるぞ。


シンプルになった気がする

要するに、回転情報アドレス、名前、名前の前後の変化を追跡してリアルタイムで更新する、の3点が実現できれば、実現できるぞ。これはいけそうな気がしてきた。明日冷静な頭で設計してみたい。今日は疲れたので無理です。

現時点では、実装可能なレベル

問題は、いつになったら実現するか、ということだ。こればかりはやってみないと分からない。1つのバグに2~3時間躓くこともあるからだ。
だが、Zscriptのリファレンスを穴が開くほど見た限りでは、実現可能な関数がいくつかある。いけるかもしれない。

まずは小さなテストからだろう。たとえば、
1つのツール内限定
サブツールは3個

これでテストしてみたい。こえで並べ替えてもリネームしてもサブツールと回転情報とがリンクし続けるならば、5個でも100個でも同様となる。
そしてかなり面倒だが、ZPR内の複数のツール内のサブツールも含めて、全てのサブツールの検査も可能だろう。理論的には。実装についてはイメージしただけでも気が遠くなった。これはすぐには無理だ。まずは比較的簡単な「1つのツール内」限定で試してみたい。


明日少しテストしてみたい。


今回の創作活動は約30分(累積 約749時間)

(175回目のブログ更新)