先日の ctr_dist と this_model の軋轢についてなんですが、何人ものお方が実験に協力して下さいましてですね、ひとつ方向性が見えた気がしますので、いったんベイクしておきます。
まず、現象として、
ctr_dist の中で this_model が使えなかった
というのは、実験してくれた人のおそらく全員で再現しました。 少なくとも、勘違いやオペレーションミスではないということになると思います。
ただし。
ctr_dist の中の pos の部分の書き方を変えると、 ctr_dist の中でも this_model が使えるということがわかりました。
つまり、pos の部分が前回の書き方の場合だとNGだということです。そこさえ書き直せば使えます。
順を追って説明します。
前回の書き方は、
ctr_dist( this_model.Man_A, this_model.Man_B )
こうでした。 Man_A, Man_B という風に、オブジェクトの名前で終わっていました。この書き方だと、this_model を使わなければ問題ないが、this_model を使い始めた瞬間にエクスプレッションがセットされないということがわかりました。
次に、
ctr_dist( this_model.Man_A., this_model.Man_B. )
ctr_dist( this_model.Man_A.kine.global.pos, this_model.Man_B.kine.global.pos )
この2つの書き方を試してみましたが、やはり同じく、エクスプレッションはセットされませんでした。
前者は、オブジェクトの名前の後ろにピリオドを置いたものです。 こう書けとマニュアルにも明記されています。 でも this_model があるとガン無視されました。
後者は、global.pos です。 タテとかヨコだけじゃなく、2点間の3D空間的な距離を求めるので、X や Y などの特定の軸を記述せずに pos で終わっています。 これも this_model が無い時には問題ないのですが、this_model が入るとガン無視です。
しかし。
ctr_dist( this_model.Man_A.kine.global.posx, this_model.Man_B.kine.global.posx )
このように、posx まで書くと、this_model があってもちゃんと効くようになりますた!! (゚∀゚)
pos でやめてはいけなかった。
posx まで書かなければいけなかった。
なぜ?
なぜかはわかりません。
観察から挙動がわかったというだけで、理由まではわりません。ともかくそうなんです。
しかしこれだと、posx と軸を限定して記述しちゃってるんだから、2点間の距離と言っても、X 軸方向の距離しか取得できてないんじゃないの、Y 方向とかに動かしたらタテの距離は考慮されないんじゃないの、という気がしますよね。
でも、やってみたら、posx と書いていても、X軸に限らず Y も Z も考慮した正しい2点間の距離を取得できていることがわかりました。
どうやって実験したかと言うと、カスタムパラメータを作り(別に必ずしもカスタムパラメータである必要はないのですが)、そちらには this_model を使わず、しかも posx ではなく pos で終わっているか、あるいは pos すら書かずに Man_A で終わっている書き方で ctr_dist を記述しました。 つまり、this_model を使ってないため何も問題なく動作することがあらかじめ分かっている書き方で2点間の距離を取得したのです。 そしてその結果は、posx まで記述した場合と完全に一致しました。
ということで、結論は、
ctr_dist の中でthis_model を使いたければ、
オブジェクト名 や
オブジェクト名+ピリオド や
オブジェクト名 .kine.global/local.pos で終わっていてはいけない。
オブジェクト名 .kine.global.local.posx まで記述しなければいけない
X とか書いてるけど、ちゃんと距離は XYZ を考慮して正しく取れるからね。
ということになると思います。
また、他の組み合わせでも実験してみたんですが、行けるものと行けないものがありました。
ctr_dist( this_model.Man_A.kine.global.posz, this_model.Man_B.kine.global.posy )
この例は Z と Y と書いていますが、問題ないです。 XYZ がどう混ざっても問題なさそうです。
ctr_dist( this_model.Man_A.kine.global.posz, Model.Man_B.kine.global.posy )
今度は、左側のみ this_model を使い、右は Model名で書いていますが、問題ないです。
ctr_dist( this_model.Man_A.kine.global.posz, Model.Man_B.kine.global.pos )
さらに右側のみ posy の Y を削除して pos で終わっている形にしましたが、これも問題ないです。 pos で終わっているとダメなのは this_model を使った場合だけであり、この例の場合、右側はthis_model を使わずに Model名を書いているので、OKだということでしょう。
ctr_dist( this_model.Man_A.kine.global.posz, Model.Man_B )
これも大丈夫でした。 Model名を使っている右側のみオブジェクト名で終わらせています。やはり、this_model さえ入ってこなければどの書き方でもかまわないように見えますね。 this_model が登場したときのみ、posx などと最後まで書かなければいけないということのように見えますね。
ただしですね、
ctr_dist( this_model.Man_A.kine.global.posz, Model.Man_B. )
このようにピリオドを入力すると、別にエラーは出ないものの、ピリオドが勝手に消えて Model.Man_B で終わる記述が保存されます。 これも納得行かない挙動ですが、まあ、ピリオド無しでちゃんと動くのだからまあいいとしましょう。
しかし一方で、
ctr_dist( this_model.Man_A.kine.global.posz, this_model.Man_B )
ctr_dist( this_model.Man_A.kine.global.posz, this_model.Man_B. )
ctr_dist( this_model.Man_A.kine.global.posz, this_model.Man_B.kine.global.pos )
これはダメでした。 左側だけ this_model + posx まで書くやり方にして、右側は this_model を使っているにも関わらず posx まで書いていないという状態です。 これだと、エクスプレッションはセットされませんでした。
つまり、たとえ片側(この場合左側)で posz まで書き切っていても、その側だけが成立しているに過ぎず、もう片側も成立しなければ全体としてエクスプレッションが完成しないのでセットされない、と解釈できると思います。
以上。
一応、ここまで分かってれば、仕事で困ることはなさそうな気がしますね。
それにしても、謎の挙動ですね。
普段は 「マニュアルの記述に反しているとまでは言えないので不具合ではない」 などとお役所のような言い方をし出すこともある俺が尊敬する某空調屋さんに勤務の某Sさんでも、きっとこれは不具合だと言うと思います。 でも不具合かどうか、正式にバグとして登録されるのかどうかは、もちろん将来的には重要ですが、今この瞬間はどうでもいいです。 Let's get this fuckin' job done. 現場はこれだけを考えていますからね。
ということで、剛田さん、193さん、りゅーぞーさん、m4g さん、ええと他にもいたっけ、実験に協力してくれた皆様、本当に有難う御座いました。俺一人ではここまでたどり着けませんでした。 是非また次もお願いします。 みんなでこの馬鹿野郎ソフトウェアをねじ伏せましょう。
そして、実験していないお方も、是非一度、上の実験を真似てやってみることをオススメします。 というのは、俺もいつもそうなんですけど、「ふーん、これは役立つ情報だな。ブックマークしておこう」 などと言ってブックマークしても、自分で実験していないと、あっという間に忘れちゃうんですよね。 ブックマークしたという事実も忘れるし、それどころか、そういう問題があると誰かが言っていたという事実までも忘れてしまいます。 でも一度実験すると、体が覚えます。
まだこういう実験ネタ、なんぼでもあります。
ブログに書くのもそれなりに大変なので、しばらく寝かせているうちに腐ってしまうネタの方が多いですね。 ほんとは鮮度が重要なんだよなあ。
15分くらいでブログ記事1本書ける能力が欲しい。
昔と比べてだいぶ速くなったけど、それでもやっぱり30分や1時間はかかることの方が多いです。
少しくらいはまとまりを持たせようなどと色気を出さずにただ書きなぐればいいのかな・・・
ともかく鮮度を失わないうちに書く。
そのためには、速く書ける能力が必要。
速く書ける能力=問題の本質部分だけを一瞬で抽出して無駄のない簡潔な文章と構成が自動的にスラスラ出てくる能力。
そんな能力磨いているヒマは俺にはねえよヴォケ
このクソったれソフトウェアと戦うだけで精一杯なんだよハゲ
.
最近のコメント