ななさいの備忘録

備忘録がわりです

最速で駆け抜けるLogix入門

この記事は「NeosVR Advent Calendar 2021」の1日目です。

adventar.org

Hello NeosVR!

NeosVRでいろんなものを自由に作れるようになりたいけど、その方法が全然わからん。

そう思ったこと、一度はありますよね。 この記事を読めば簡単にできちゃいますよ *1

時間がなく、推敲する時間がなかったので大分雑になってますが大目に見てください。

気が向いたら清書します。

対象

プログラムを少しでも齧ったことのある人。

プログラマ向けの内容は体力があれば書こうと思います。

何を知ればいいの?

だいたいこの要素を知ってたらよい。

(詳しい話をすると「それは違うよ」ってなるかもしれないが、はじめは考えなくて良いと思うので説明を省略)

  1. 処理の順番・Neos特有の処理
  2. 条件分岐
  3. 繰り返し
  4. 値の取得
  5. 値の設定
  6. 値の保存
  7. モノの複製

(8. コンポーネントとの兼ね合い)*2

(9. 便利なノード) *3

処理の順番・Neos特有の処理について

大半は左から右に処理は進むと考えればヨシ。 f:id:ChameleonO2:20211201204129p:plain

出力される値は基本的に複数に分けることがでできる。 f:id:ChameleonO2:20211201204142p:plain

ボタンを押したら実行するとか、そいう処理はパルスを使う。

パルスは複数に分岐できない。 f:id:ChameleonO2:20211201204156p:plain f:id:ChameleonO2:20211201204204p:plain

パルスが出た瞬間しか値を出さないノードがある。

そもそもパルスって何よっていう本質を知りたい場合は下記の記事を見るとよくわかる。

qiita.com

条件分岐について

条件分岐とは 何かしらの入力に対して何かしらの処理を行い、その結果で処理に違いを持たせるということ。

簡単なものだと、スイッチも条件分岐の一種だ。

Onの時は電気がついて、Offの時は電気が切れる。これも条件分岐の一種と考えることが出来る。

実際のノード

TrueとFalseを判定して値を分ける。

f:id:ChameleonO2:20211201204234p:plain
Trueの時は上の値が選択される。
f:id:ChameleonO2:20211201204257p:plain
Falseの時は下の値が選択される

TrueとFalseを判定して処理を分ける。

f:id:ChameleonO2:20211201204321p:plain
Trueの時は上の処理が実行される
f:id:ChameleonO2:20211201204338p:plain
Falseの時は下の処理が実行される。

繰り返し

この処理何回もやりたい!ってときがたまにある。

そういう時は繰り返し。

実際のノード

For f:id:ChameleonO2:20211201204615p:plain

While f:id:ChameleonO2:20211201205912p:plain

無限ループについて

Neosは内部でループできる回数が決まっている。

無限ループするとノードが赤くなり、エラーとなる。

f:id:ChameleonO2:20211201211449p:plain
赤いノードはLogixTipでレーザを当て、セカンダリで修復できる。

値の取得

手段1

Logix ToolTipのモードをinterfaceモードにして 欲しいSlotをつかんでセカンダリを押すと interfaceノードと呼ばれる値をとるための板が出てくる。

f:id:ChameleonO2:20211201211813p:plain

f:id:ChameleonO2:20211201211928j:plain

f:id:ChameleonO2:20211201211938j:plain

ここから伸ばせば値がとれる。

f:id:ChameleonO2:20211201212011j:plain

コンポーネントの値も同様 f:id:ChameleonO2:20211201212554j:plain

手段2

特定の要素は特定のノードを経由してとることもできる。

f:id:ChameleonO2:20211201212619j:plain
つかんでいるかをとるノード

手段3

DynamicField

f:id:ChameleonO2:20211201213147j:plain
値に自由に名前が付けられる。

詳しくは れにうむさんの記事を参照のこと

qiita.com

記事の最後にある2フレーム問題は解決したらしい?

個人的にはこれが一番おすすめ。

値の設定

手段1

interfaceノードに直接つないであげる方法(Drive)

f:id:ChameleonO2:20211201213736j:plain
値を変えるとすぐに動く

手段2

値を書き込んであげる方法(Write) f:id:ChameleonO2:20211201213814j:plain

f:id:ChameleonO2:20211201213823j:plain
パルスを送ると書きこまれる。

手段3

WriteDynamicValiable

f:id:ChameleonO2:20211201213853j:plain
値の名前を指定してパルスを送ると書きこまれる。

値の保存

手段1

レジスターというノードがある。これに対してWriteしてあげると値が保存することが出来る。

f:id:ChameleonO2:20211201214755j:plain f:id:ChameleonO2:20211201214805j:plain

f:id:ChameleonO2:20211201214852p:plain

手段2

DynamicValueValiable

f:id:ChameleonO2:20211201215544j:plain f:id:ChameleonO2:20211201215554j:plain

モノの複製

Duplicate Slotを使う

f:id:ChameleonO2:20211201215612p:plain
パルスを送るものは送った瞬間にしか値が出ない。

なので先ほどのWriteなどを使ってあげてSlot情報を保存したりする。(同じパルス内で処理される場合は不要

f:id:ChameleonO2:20211201215710p:plain

だいたいこのあたりが出来たら後はノードを把握するだけ・・・のはず

*1:個人差があります。

*2:後で追記します・・・

*3:後で追記します・・・