見出し画像

言われないと気づかないLogiXノード達

この記事は、NeosVR #1 Advent Calendar 2021の24日目の記事です。
昨日は、ないさすさんの
おんぼろPCしばき倒してheadless立てる
でした。

■はじめに

こんにちは、Aetorizです。今回は「言われないと気づかないLogiXノード達」ということで、NeosVRのLogiXを独学で学んでいると気づかないかも知れないことについて書きした。
LogiXについて何も分からないという方は、同アドベントカレンダーのChameleonO2さんの「最速で学ぶLogiX入門」、e1ght3さんの「LogiX開発を勉強するための覚書」を先に読むことをおすすめします。

ちなみにこの記事はnoteでの初投稿です。

■「そんなノードがあったのか」編

便利だけど余り知られていない、使っている人をあまり見ないノード達です。「そんなノードがあったのか」編では使用しているLogiXの階層も記載しました。

・ ≈(Approximately Equal)

画像1

Root -> Operators ->

このノードは入力Aと入力Bの差が入力Epsilon未満の場合Trueを返します。浮動小数点の計算誤差でFloatの値が厳密には違ってしまう場合があるときなどに=の代わりに使用できます。

≈(Approximately Equal)は、「ほぼ等しい」「近似的に等しい」を表す記号です。日本では≒(Nearly Equal)の方がなじみ深いですね。
ちなみにEpsilonは、数学において主に「とても小さな数」「零に近い微少量」として使われます。

・ Index Of First Match

画像2

Root -> Utility ->

このノードは入力Matchと最初に合致した入力Valueを返します。入力の最大値を返すMaxや最小値を返すMin等と組み合わせることで、入力の何番目が最大値・最小値なのかを知ることができます。

・ Chirality, Get Side, Other Side

画像3

Root -> Avatar -> BodyNode ->

Chiralityは入力Nodeの左右を返します。
Get Sideは入力Nodeの入力Side側のBodyNodeを返します。
Other Sideは入力Nodeの反対側のBodyNodeを返します。

BodyNodeの左右反転は=と三項演算子を使用しなくても行うことができます。持っている手の反対側を取りたいとき等に便利です。

・ Is Character Controller,
As Character Controller

画像4

Root -> Physics ->

Is Character Controllerは入力ColliderのタイプがCharacterControllerならTrueを返します。
As Character Controllerは入力ColliderのタイプがCharacterControllerでCharacter Controllerコンポーネントが存在する場合、そのCharacter Controllerコンポーネントを返します。

上図は歩行/飛行を使っているユーザーが通ったときに一度だけパルスを出すLogiXのサンプルです。
説明のためにIs Character Controllerと&を挟んでいますが、Is Character ControllerがFalseの場合はIs Local UserもFalseとなるので実際は必要ありません。

■「それ繋がるのか」編

一見繋がらなそうなノードでも実際は繋がることがあります。試してみようと思わないとなかなか気づけません。

・ +

画像5

意外と知らない人を見かける繋げ方。確かに+って数字しか繋がらないと思いますよね。
string(文字列)とchar(文字)の順番は上下逆でも繋がります。

・ 1-x, +1, 1/x

画像6

1-xや+1、1/xなどのノードはfloat2やint3、colorなどの二次元以上の型をそのまま繋げることができます。Unpack/Packの手間が省けるので地味に便利です。

・ Unpack xyzw

画像7

Unpack xyzwにはfloatQとcolorを繋ぐことができます。floatQの場合は右側の四元数(クォータニオン)を返します。他のノードで事足りることが多いので余り使う機会はないですが、稀に必要になると分けるノードが見当たらなくて困ることがありました。

・ Find Character Controller

画像8

これはわりと有名な変化ですが、たまにUserRootSlotを通してる物を見かけることがあるので一応入れておきました。正直Slot型繋げるよりUser型を繋げる方がわかりやすくて便利な気がします。

・ Write

画像9

今回の目玉です。使ってる人はほとんど見ないけど超便利、ただし見た目がちょっときもい繋げ方です。

実はWrite等の右側にあるTargetは”参照の入力”なのでMultiplex等の出力側に繋がります。見た目の違和感が凄いですが、入力用とWrite用のMultiplexを用意することで複数のWriteを1つにまとめることができるのでとても便利です。

先に一度何かに繋げて矢印を出した後、矢印からMultiplexに繋ぐことでMultiplexがこの型に変化します。

画像10

もちろんDemultiplexやPick Randomに繋げることもできます。
また、DriveやPlaybackを出力側に繋げることもできます。

■「その組み合わせできるのか」編

加減乗除などは2つの入力が同じ型ではなくても繋がることがあります。組み合わせだけでなく上下の順番も気にする必要があります。

・ float * float3, floatQ * float3

画像11

組み合わせによって別の型でも乗算できます。floatQ * float3はfloat3ベクトルをfloatQだけ回転させたfloat3ベクトルを返します。

float * float3は上下逆でも繋がりますが、floatQ * float3はfloatQが上でないと繋がらないので注意しましょう。

・ float3x3 * float3, float4x4 * float3

画像12

3x3行列や4x4行列とfloat3は乗算することができます。行列による座標変換を行う場合にとてもよく使うので覚えておくと便利です。

ちなみに2x2行列とfloat2は繋がりません。

・ DataTime + TimeSpan

画像13

時間のオフセット等に使用できます。誰から見ても日本時間で表示したい場合などはTimeSpanでUTCNowをずらしましょう。
時間の大小を比べることもできます。

ちなみに、たいていの場合は正常に動作するのであまり気にしなくても大丈夫ですが、時間を厳密に管理する場合にTo Local Timeは人によって正しくないことがあるので過信は禁物です。


■おわりに

今回の記事を書いた理由は「見た目がきもいけど超便利なWriteの話をしたかった」がほとんどです。便利だけどまさか繋がるとは思わない筆頭みたいなノードの繋げ方ですね。

こういったのは暇なときとかに色んなノードと型を適当に繋げて遊んでると偶に発見したりします。というか私が見つけた変な使い方や繋げ方は大体暇つぶししてる時に見つけたものです。みなさんも暇つぶしにLogiXをしましょう。

以上です。ここまでお読みいただきありがとうございました。

NeosVR #1 Advent Calendar 2021
Neos VR #2 Advent Calendar 2021


この記事が気に入ったらサポートをしてみませんか?