LogiXノードブラウザ探訪

この記事は Neos VR #2 Advent Calendar 202120日目の記事です。

adventar.org

昨日の担当はe1ght3さんで今すぐ遊べるneos内ゲームの世界でした。いろんなゲームワールドも回ってみたいですね(それにしてもレースワールドが多かったですね)。
Neos VR #2 Advent Calendar 2021はまだスッカスカなので、今から記事とかを書いても間に合いますよ。アドカレは別に日付が過ぎてから公開しても構わないので、せっかくカレンダー用意してもらったので埋めていきませんか?


Neos で LogiX を触り始めた際に、「こういう値が取れるノードって無いのかな」となることが多く発生すると思います。
LogiX ではノードの存在を知っているかどうかで処理の作りやすさがかなり違うので、筆者は暇なときに Neos の公式 wiki の LogiX 一覧 を眺めていますが、未だ全てのノードを把握できていません。

ただ、ノードブラウザには同種のものがカテゴリ分けされているので、どういうノードが同じカテゴリに入っているかを知っているとある程度はノードを探しやすいと思います。筆者はカテゴリを開いて名前を見ながら、どんなノードなのか当たりをつけて機能を調べています。
この記事では、LogiX 開発でよく使われる(と思われる)ノードのカテゴリを紹介していきます。併せて、カテゴリ内のちょっとわかりづらい名前だけど便利なノードの紹介もします(ほぼ必ず使いそうなノードは情報がたくさんありそうなので、敢えて外しています)。

f:id:trpg_yoshi:20211220200646j:plain
今回紹介するカテゴリたち。独断と偏見でよく使いそうなカテゴリをピックアップしました。


ノードブラウザを旅する手引き

LogiXTipのラベルによるヒント

ノードの名前から機能は推測できるけど、どこに何を繋いだらいいのかわからないノードに遭遇したときは、LogiXTipを装備して入力欄や出力欄にレーザーを合わせてみましょう。入力欄ならどんな値を入力される場所なのか、出力欄ならどんな値が出力されるのかが書いてあります。

f:id:trpg_yoshi:20211220200724j:plain
LogiXTipのヒント。入力欄や出力欄にレーザーを合わせると、LogiXTipの上に簡単な説明と型情報が出てくる。

検索機能

全てのノードを把握するのは無理なので、検索機能を活用しましょう。
JP Publics/個人 Individual/esnya public/TooltipAddonsにあるNodeBrowzer++には検索機能があります。
※追記: JP Public/個人 Individuals/yoshi1123_ public/Toolに検索機能を改良したNodeBrowzer++を置いてます。 Searchのタブを押すと検索窓があるので、そこに探しているノードの名前を入力するとノードブラウザ上の場所を検索してくれます。([T]のボタンを押すとコンポーネント検索にも切り替わります。)
欲しい機能っぽい単語を英語で入力すると検索に引っかかる可能性があります。

f:id:trpg_yoshi:20211220200850j:plain
NodeBrowzer++による検索機能。timeが含まれるノードを検索している。

LogiX カテゴリ

Operators

https://wiki.neos.com/Category:LogiX:Operators
四則演算や大小比較など、簡単な計算や処理をするノードが集まっています。プログラミングでも頻出の基礎的な処理もたくさんあります。LogiXを触り始めたときに四則演算を探してMath/ばかり見てて見つからなかった悲しい記憶があります。

  • Pack xyz, Unpack xyz: float3のような3次元の値を1次元のfloatに分解したり、あるいはfloatをfloat3に結合したりできます。
  • 0 1: boolを入力してfalseなら0、trueなら1に変換します。
  • Parsing/: stringを他の型にparseします。型ごとに別のノードがあります。

Math

https://wiki.neos.com/Category:LogiX:Math
Operators/にあるノードよりもすこし高度な数学っぽいノードが集まっています。乱数(Random/)や回転計算(Rotation/)、日時(DateTime/TimeSpan/)などのノードもサブカテゴリに存在します。

  • Remap, Remap -1..1 to 0..1: 入力と出力の範囲を指定して値を変換します。Sinのような[-1, 1]の範囲の値を[0, 1]の範囲に変更するときなどに使います。
  • Clamp, Clamp01: 最大値と最小値を指定して、範囲から外れる値を最大値/最小値で抑え込みます。
  • : 1フレームでの入力値の変化量が取れます。微分みたいなイメージ。

f:id:trpg_yoshi:20211220200946p:plain
上下方向(Y軸)の移動速度の取得

String

https://wiki.neos.com/Category:LogiX:String
文字列操作周りのノードがまとまっています。テキストをこねくり回したいときに多用します。

  • Format: いろんな値をstringに整形できます。C#のFormatの書式に従うらしいです。
  • Index Of String: 特定の文字列が対象のstringのどこにあるかを検索できます。
  • String Join: 複数の文字列をSeparatorで結合できます。カンマ区切りやスペース区切りでたくさん繋げたいときに便利です。

Flow

https://wiki.neos.com/Category:LogiX:Flow
Impulse(インパルス、パルス) の処理に関するノードが集まっています。条件分岐やループ処理などをするときに多用します。

  • Boolean Latch: パルスを受けてboolをtrue/falseに設定したり、toggleさせたりすることができます。
  • Sequence: 1つのパルスを複数のパルスに順次流していくことが出来ます。※パルスの処理は上から順に行われていきます。同時にはできません。
  • Events/: ゲーム内でのイベントに応じてパルスを発生させることができるノードが集まっています。

Input

https://wiki.neos.com/Category:LogiX:Input 自由入力のノードや、時間を出力するノードなどが集まっています。主に時間経過に対して何かしたいときに使います。(自由入力のノードは、他のノードの入力のところから紐を引っ張ってセカンダリーで取り出せるので、あまり使ったことはないです。)

  • T, T*10, T/10, T/2: セッションが建ってからの時間が出力されます。Math/Sinなどにつなぐと振動する値が作れます。
  • UtcNow: プログラムでよく使われる協定世界時(UTC)の現在時刻が取得できます。日本時刻に変換する場合はMath/DateTime/To Local Timeなどに繋ぎます。
  • Elapsed Time: 入力パルスが流れてからの時間を取得できます。

f:id:trpg_yoshi:20211220201047p:plain
ダブルクリック時のパルスを取得するLogiX。ダブルクリックの間隔を0.5秒以内のクリックとしている。

Actions

https://wiki.neos.com/Category:LogiX:Actions コンポーネントの要素や後述するVariables/Storage/ノードに値を書き込んだりするノードが集まっています。オブジェクトや変数に値を反映したいときに使います。

  • Write Ref: 主にSlotやUserなどのような参照型をコンポーネントの値にWriteするときに使います。
  • Drive: 通常のインターフェースノードに繋ぐDriveとは異なり、パルスによってドライブ開始/終了が制御できるノードです。
  • Tween: 指定した開始~終了の値に一定時間で少しずつ変化していくように値を書き換えることができます。

Variables

https://wiki.neos.com/Category:LogiX:Variables
変数に関わるノードが集まっています。値を保持しておきたいときに使います。

qiita.com

Slots

https://wiki.neos.com/Category:LogiX:Slots
ゲーム内オブジェクトのスロットを操作したりするノードが集まっています。スロットの情報を取得したり、スロットの階層を変えたりするときに使います。

  • Index Of Child: そのスロットが、親スロットの何番目の子かを取得できます。
  • Destroy Slot Children: スロットの子スロットを全て削除できます。
  • Get Active User Self: このノードが入っているユーザーを取得できます。このノードが入ったオブジェクトをアバターに入れたり、グラブしたりしてユーザーを取得するときによく使います。(何故かUsers/に無いので注意。)

f:id:trpg_yoshi:20211220201425p:plain
Get Active User Selfノードがユーザーの子にいれば[ユーザー名] loves NeosVR。N-JERRYさんのLogiXパーカーオススメです。

Users

https://wiki.neos.com/Category:LogiX:Users
ユーザーに関するノードが集まっています。ユーザー関連の型はUser, User Root, User Root Slotなどいろいろありますが、よくわかんないけど相互に変換するノードがあるので適当に変換したら多分使えます。

  • Is Local User: ユーザーがローカルユーザー(≒自分自身)かどうかが取得できます。
  • User From Username: ユーザーをユーザー名(Neosのアカウントの名前)で取得できます。
  • Local User Space: ローカルユーザーがいる親スロットを取得できます。ユーザーの場所が移動されてるとRoot Slot直下にいないことになりますが、このノードを使えばある程度対応できます。

f:id:trpg_yoshi:20211220201611p:plain
自分にしか見えないアイテム。自分はActiveがTrueだが、他の人から見るとFalse。

Transform

https://wiki.neos.com/Category:LogiX:Transform
スロットの位置(position)や回転(rotation)、拡大/縮小(scale)についてのノードが集まっています。スロットの位置を操作したり向きを調べたりするときに使います。

Input Devices, Interaction, Tools

https://wiki.neos.com/Category:LogiX:Input_Devices
https://wiki.neos.com/Category:LogiX:Interaction
https://wiki.neos.com/Category:LogiX:Tools
3つ別のカテゴリですが、それぞれユーザーの入力やインタラクトに対して情報が取れるノードが集まっています。ボタンを押したり何かを持ったりなど、わかりやすい入力に対して処理を組みたい場合はよく使います。

f:id:trpg_yoshi:20211220201746p:plain
グラブしている手の情報を取得するLogiX。トリガーを押しているかやグラブしているかなどが取得できる。

Network

https://wiki.neos.com/Category:LogiX:Network
外部のサーバーにリクエストを飛ばしたりするノードが集まっています。VR内でやりづらい処理を外部に処理を投げたり、あるいは外部のデータベースから情報を引っ張ってきたりすることができます。

  • GET String: HTTP GETリクエストを飛ばせます。
  • POST String: HTTP POSTリクエストを飛ばせます。
  • Websocket/: Websocket関係のノードがあります。(筆者がWebsocketよくわからんので紹介できません……。)

qiita.com

終わり

他にもよくわからんノードはいっぱいあります。詳しそうな人に聞いてみたり、LogiXを組んでる横で知らないノードについて質問してみたり、みんなでこのノード何?って話ながらいろんな入力を入れてみて機能を推測してみたりするといいと思います。いろんなノードのことを知ってるとできることが増えていくでしょう。