Bread Board初心者用補足

Last-modified: 2025-11-08 (土) 21:17:38

編集時Ver3.1.2.4
Bread Boardの基礎的な部分の補足です。

bread0.jpg

1.ブレッドボードができること

ACBが 情報入力→機器に出力 をするブロックだとすると、
ブレッドボードは 情報入力→計算→命令を出力 ができるブロック。
例えばビークルの高度を取得し、低ければ船首を上げ、高ければ船首を下げることなどができる。


数値の扱いにとても長けていて、ややこしい条件分岐などもこなす。
複数のACBの機能をひとまとめに代替することもできるので便利。

2.ブレッドボードにできないこと

出力が貧弱で、ACBのように機器を直接動かすことはできず、ドライブ値しか出力できない。
このため、スピンブロックやジェットなどのようにスラスタ用のドライブ値を受け取ることができるブロックしか操作できないことに注意する。*1
bread3_1.jpg
入力情報はかなり豊富に取れる。
AIの目指しているヨー・ピッチ・ロールが取得できないので、原則AIPIDの代替はできない。

3.各部名称

四角いものがコンポーネント。*2
これらをリンク*3で左から右に情報をつないで渡していく。
bread1_1.jpg
Maths Evaluatorが万能なのでMultiply・Switch・Sum・Clampは無理して使わなくてもよい。
PropulsionはDrivesの機能も持っている。

4.操作方法

bread4.jpg

  1. 右のボタンをクリックで新規コンポーネントが左上に出現する。
  2. コンポーネントを左クリックで選択し、
  3. 右クリックで指定した位置に移動する。
  4. 右上のボタンをクリックで削除できる(Delキーでも可)。

bread5.jpg

  1. コンポーネントの右上のアウトプットを選択し、
  2. 他のコンポーネントの左上のインプットをクリックでリンクをつなぐ。
  3. 右上のボタンをクリックで削除できる(Delキーでも可)。

5.Maths Evaluatorの使い方

足し算、かけ算からベクトル解析までこなす最強のコンポーネント。

計算式一覧

計算式一覧

Logic Gate名称論理ゲート
説明NOTやORなどの論理回路になるブロック。入力の解釈には3種類あり、上から
①0以外
②0より大きい
③1以上
NOT説明論理否定。出力を反転する
AND説明論理積。入力ノード両方に入力があった時に出力する
OR説明論理和。入力ノード1か所以上に入力があった時に出力する
XOR説明排他的論理和。入力ノードのどちらかに入力があった時のみ出力する
NAND説明否定論理積。入力ノード両方に入力がない時に出力する
NOR説明否定論理和。入力ノードに全く入力がない時に出力する
XNOR説明否定排他的論理和。入力ノード両方の状態が一致している時に出力する
Max/Min名称最大/最小
説明複数の入力に対してそのうち最大もしくは最小の値のみを出力する。第一出力末端がその値、第二出力末端が何番目の入力を出力しているかを出力する
Sorter名称並び替え
説明複数の入力に対して値の小さい順もしくは大きい順に出力の順番を調整する
Comment名称コメント
説明**加筆求む!**
Accumulator(with threshold)名称累算器(閾値付き)
説明**加筆求む!**
Threshold名称閾値
説明**加筆求む!**
One shot名称ワンショット
説明**加筆求む!**
Delay Pulse名称遅延パルス
説明coming soon...
Playback名称音声再生
説明音声ファイルを再生するコンポーネント。デフォルトで入っているMihoの音声のほか、C:\Users\[ユーザー名]\Documents\From The Depths\Sounds内に入れたファイルを認識する。0以上の数値が入力されたときに再生される
説明誰の音声を再生するかプルダウンから選択できる
説明音声ファイルがまとめられているときはここから選択可能
説明「#+ファイル名」で再生する音声ファイルを指定できる
Delay説明入力ノードに数値が来てからどの程度遅れて再生するか設定できる。上限と下限を0~10秒の間で設定可能
Audible distance説明どの範囲まで音が聞こえるか設定できる。上限と下限を1~5000mの間で設定可能
Pitch説明再生時の音声のピッチを設定できる。上限と下限を0.1~10の間で設定できる ※音程と一緒に再生速度も変わる
Doppler説明音声のドップラー効果の強さを設定できる。上限と下限を0~1の間で設定できる
Generic block setter名称汎用ブロック設定
説明数値を設定できるアイテムに対してBBから値を設定できる。ブロックのアイテム名の後ろにある(#○)はいくつのアイテムを設定しようとしているかの数
Block name filter説明そのブロックについている名前(shift+Nで付けられる奴)でフィルターを設定できる
※名前については"完全一致"ではなく"含む"なので命名時注意!
項目②説明設定したいアイテム
項目③説明そのアイテムのどの値を設定するか
Maths Evaluator名称演算評価
説明最強の演算装置。第一入力末端から第五入力末端までの入力をExpession内に記述された式で演算し、その値を出力する。出力末端は最大で5つで、式が1個ならすべて同じ値を出力する 
追記:ver3.9.0.0より入力末端と出力末端の個数はアルファベットと同じ26個に増加しました
Expression説明ここに記述された式の演算を行う 例:a=3 b=10 c=1の時、(a*b)/c → 出力値30  複数の式をまとめる時、(a*b)/c,a+b+c → 第一出力末端の出力値30、第二出力末端の出力値14
v3.9.1.0より改行ができるようになりました
Icon width説明ノードの幅を5~200ピクセルの間で設定する
Show documentation説明ここに各演算子や入力変数名、関数などの説明がある内容については以下の通りである
Constants/Inputs 以下定数と入力値(オペランド)
Pi説明円周率(3.14159265358979)
Right説明x方向のベクトル成分(1をセット)  例:Right*10→(10.0 0.0 0.0)
Up説明y方向のベクトル成分(1をセット)  例:Right*10→(0.0 10.0 0.0)
Forward説明z方向のベクトル成分(1をセット)  例:Right*10→(0.0 10.0 0.0)
a説明第1入力末端入力値
b説明第2入力末端入力値
c説明第3入力末端入力値
z説明第26入力末端入力値
Functions 関数(※一部順不同)
(戻り値の型)
(関数の形)
訳文※戻り値の型についてはnumber(数値)とvector(ベクトル)の要素はdouble型(v3.9.0.0~)、integer(整数)はlong型です
number
Sin(number x)
訳文xの正弦を数値で返します。xは度数で認識されます  例:Sin(30)→0.5, Sin(-30)→-0.5
number
Cos(number x)
訳文xの余弦を数値で返します。xは度数で認識されます  例:Cos(60)→0.5, Cos(240)→-0.5
number
Tan(number x)
訳文xの正接を数値で返します。xは度数で認識されます  例:Tan(45)→1
number
Sqrt(number x)
訳文xの平方根を数値で返します  例:Sqrt(625)→25
number
Asin(number x)
訳文xの逆正弦を度数で返します  例:Asin(1)→90
number
Acos(number x)
訳文xの逆余弦を度数で返します  例:Acos(-1)→180
number
Atan(number x)
訳文xの逆正接を度数で返します  例:Atan(1)→45
number
Atan2(number y, number x)
訳文点(x, y)に対応する角度を度数で返します  例:Atan2(√3/2, 1/2)→60
number
Exp(number x)
訳文ネイピア数eのx乗を数値で返します  例:Exp(1)→2.71828182845905, 1/1+Exp(1)^-x→シグモイド関数σ(x)
number
Log(number x)
訳文xの自然対数を数値で返します  例:Log(Exp(1))→1
number
Pow(number b, number p)
訳文bのp乗を数値で返します  例:Pow(5, 2)→25
number
Abs(number x)
訳文xの絶対値を数値で返します  例:Abs(-3.14)→3.14
vector
Abs(vector v)
訳文vの各要素の絶対値をベクトルで返します  例:Abs(-2, 0.5, -4.44)→(2, 0.5, 4.44)
number
Sign(number x)
訳文xの符号を数値(-1, 0, 1)で返します  例:Sign(123.123)→1, Sign(-456)→-1, Sign(0)→0
number
Round(number x)
訳文xに最も近い整数を数値で返します。小数第一位の四捨五入で最も近い整数が決定します  例:Round(1.499)→1, Round(100.5)→101
number
Floor(number x)
訳文xの小数点以下を切り捨てた値を数値で返します  例:Floor(1.499)→1, Floor(100.5)→100
number
Ceil(number x)
訳文xの小数点以下を切り上げた値を数値で返します  例:Ceil(1.499)→2, Ceil(100.5)→101
number
Max(number a, number b, [number c])
訳文aとbとcのうち最も大きい数値を返します。cは無くても機能します  例:Max(3.14, 3.1415, 3.141592)→3.141592, Max(3.14, 3.1415)→3.1415
number
Min(number a, number b, [number c])
訳文aとbとcのうち最も小さい数値を返します。cは無くても機能します  例:Max(3.14, 3.1415, 3.141592)→3.14, Min(3.14, 3.1415)→3.14
integer
Max(integer a, integer b, [integer c])
訳文aとbとcのうち最も大きい整数を返します。cは無くても機能します  例:Max(5, 10, 15)→15(int), Max(5, 10)→10(int)
integer
Min(integer a, integer b, [integer c])
訳文aとbとcのうち最も小さい整数を返します。cは無くても機能します  例:Min(5, 10, 15)→5(int), Min(5, 10)→5(int)
number
Max(vector v)
訳文vの成分のうち最大のものを返します  例:Max(a(4, 3, 4))→4
AnyType
If(number condition, AnyType if true, AnyType if false)
訳文If構文です。If(数値に関する判定式, 正のとき、偽のとき)のように使います。入れ子にすることで複数の条件分岐が可能です
例:If(a>10,10,a)→aが10を超えたら10のまま、10以下はそのままaを出力する
例:If(a>10,10,if(a<0,0,a))→aが10を超えたら10のまま、10以下のときに0未満であれば0のまま、それ以外はそのままaを出力する
AnyType
If(integer condition, Anytype if true, Anytype if false)
訳文上記の関数の整数バージョン
text
String(AnyType to be a string, [text format code])
訳文v3.9.0.0で追加
C#のToString()メソッド、簡単に言えばエクセルのデータ形式と同様の働きをします。text format codeは無くても機能します。詳しくはToStringメソッドでの書式指定(Qiita)を見てね(他力本願寺)
例:String(3.14, "c")→"$3.14", String(3.14, "e")→"3.140000e+000", String(3.14, "##.##")→"3.14", String(3.14)→"3.14"(文字列で出力されることに注意!)
vector
Vector(number x, number y, number z)
訳文x~zを用いて3次元行ベクトルを返します  例:Vector(1, 2, 3)→(1, 2, 3)
integer
Int(number x)
訳文xを四捨五入して整数xとして返します  例:Int(3.14)→3(int)
integer
Int(integer x)
訳文xを整数xとして返します。よくわかりませんが安全のため追加されているとのこと  例:Int(3)→3(int)
integer
Int(text s)
訳文sを整数xとして返します。整数として返せない場合は整数0を返します
例:Int("5")→5(int), Int("3.14")→0(int), Int("abcde")→0(int)
number
Num(integer x)
訳文xを数値xとして返します  例:Num(4)→4
number
Num(number x)
訳文xを数値xとして返します。よくわかりませんが安全のため追加されているとのこと  例:Num(4)→4
number
Num(text s)
訳文sを数値xとして返します。数値として返せない場合は数値0を返します  例:Num("3.14")→3.14
vector
ToUniversal(vector standard coord)
訳文v3.9.0.0で追加
Positionノードのスタンダード座標(Unityゲームエンジン上の座標)をユニバーサル座標で返します
例(第1入力末端aにPosition[Standard]をつないだ状態で):ToUniversal(a)→(対応した3次元行ベクトル)
vector
ToStandard(vector universal coord)
訳文v3.9.0.0で追加
Positionノードのユニバーサル座標をスタンダード座標(Unityゲームエンジン上の座標)で返します
例(第1入力末端aにPosition[Universal]をつないだ状態で):ToStandard(a)→(対応した3次元行ベクトル)
vector
LocalPosToGlobalPos(vector local position,
vector parent position, rotation parent rotation)
訳文自機のローカル座標系での位置をワールド座標系での位置に変換します(※1:編者未使用につき正しくない場合があります)
vector
GlobalPosToLocalPos(vector global position,
vector parent position, rotation parent rotation)
訳文自機のグローバル座標系での位置をローカル座標系での位置に変換します(※1)
rotation
LocalRotToGlobalRot(rotation local rotation,
rotation parent rotation)
訳文自機のローカル座標系での回転をグローバル座標系での回転に変換します(※1)
rotation
GlobalRotToLocalRot(rotation global rotation,
rotation parent rotation)
訳文自機のグローバル座標系での回転をローカル座標系での回転に変換します(※1)
vector
LocalDirToGlobalDir(vector local direction,
rotation parent rotation)
訳文自機のローカル座標系での方向をグローバル座標系での方向に変換します(※1)
vector
GlobalDirToLocalDir(vector global direction,
rotation parent rotation)
訳文自機のグローバル座標系での方向をローカル座標系での方向に変換します(※1)
rotation
FromToRot(vector from, vector to)
訳文第一引数のベクトルから第二引数のベクトルへの回転をクォータニオンで返します
rotation
FromEuler(number pitch, number yaw, number roll)
訳文Pitch(x), Roll(y), Yaw(z)の角度をクォータニオンとして返します。x, y, zはOrientation inputから取得しなくても問題ありません
rotation
FromEuler(vector angles)
訳文ベクトルのx, y, z成分からなるオイラー角をクォータニオンとして返します
vector
ToEuler(rotation angles)
訳文オイラー角からx, y, zの角度を返します
number
Angle(rotation r)
訳文クォータニオンからその方向の単位ベクトルの角度を数値として返します(※1)
number
Angle(vector v, vector w)
訳文ベクトルvとベクトルwの2点間の角度を返します
vector
Axis(rotation r)
訳文クォータニオンからその方向の単位ベクトルを返します(※1)
vector
setX(vector vector, number new x)
訳文第一引数のベクトルのx成分を第二引数で置き換えます(※1)
vector
setY(vector vector, number new y)
訳文第一引数のベクトルのy成分を第二引数で置き換えます(※1)
vector
setZ(vector vector, number new z)
訳文第一引数のベクトルのz成分を第二引数で置き換えます(※1)
vector
outputV(number i)
訳文i番目の出力末端における直前のフレームの出力を返します。直前の出力がベクトルでなかった場合は(0, 0, 0)を返します(※1)
number
output(number i)
訳文i番目の出力末端における直前のフレームの出力を返します。直前の出力が数値でなかった場合は0を返します
例:a,(a>output(1))+output(2)→","で出力先が変わるため、"a"がoutput(1)に格納され、"(a>output(1))+output(2)"がoutput(2)に格納されます。aが0より大きくなると直前のaであるoutput(1)を超えるためa>output(1)がtrueすなわち1となるので1+output(2)の結果がoutput(2)に入ります。これはいわゆるカウンタです(下の方で解説します)
Properties 属性(※一部順不同)
number
(vector v).x
訳文ベクトルvのx成分を返します 例(第1入力末端にベクトル(1,2,3)をつないだ状態で):a.x→1
number
(vector v).y
訳文ベクトルvのy成分を返します 例(第1入力末端にベクトル(1,2,3)をつないだ状態で):a.y→2
number
(vector v).z
訳文ベクトルvのz成分を返します 例(第1入力末端にベクトル(1,2,3)をつないだ状態で):a.z→3
number
(rotation q).x
訳文v3.9.0.0で追加
クォータニオンqの第一引数を度数として返します。.xは.pitchと書いても機能します 例(第1入力末端にRotation[Quaternion]をつないだ状態で):a.x→(対応した角度), a.pitch→(a.xと同様の角度)
number
(rotation q).y
訳文v3.9.0.0で追加
クォータニオンqの第二引数を度数として返します。.yは.yawと書いても機能します 例(第1入力末端にRotation[Quaternion]をつないだ状態で):a.y→(対応した角度)
number
(rotation q).z
訳文v3.9.0.0で追加
クォータニオンqの第三引数を度数として返します。.zは.rollと書いても機能します 例(第1入力末端にRotation[Quaternion]をつないだ状態で):a.z→(対応した角度)
number
(vector v).magnitude
訳文ベクトルvの大きさを数値で返します 例(第1入力末端にベクトル(2,4,4)をつないだ状態で):a.magnitude→6
number
(vector v).sqrMagnitude
訳文ベクトルvの大きさの2乗を数値で返します 例(第1入力末端にベクトル(2,4,4)をつないだ状態で):a.sqrMagnitude→36
rotation
(rotation r).inverse
訳文クォータニオンrの共役クォーニタオンr̅(回転はそのままにxyz軸がすべて反転)を返します 例:(第1入力末端にRotation(0°,356°, 0 ゚ )をつないだ状態で):a.inverse→(0°,4°, 0 ゚ )
Operators 演算子(※一部順不同)
number
(number x) + (number y)
訳文x + y 例:1 + 2→3
integer
(integer x) + (integer y)
訳文x + y 例:1(int) + 2(int)→3(int)
number
(integer x) + (number y)
訳文x + y。整数と数値が逆でも数値が返ってきます 例:1(int) + 2→3, 1 + 2(int)→3
text
(text x) + (text y)
訳文v3.8.2.0で追加
x + y 例:"Advanced" + "Cannon"→"AdvancedCannon"
vector
(vector v) + (vector w)
訳文v + w 例:(1, 2, 3) + (4, 5, 6)→(5, 7, 9)
number
(number x) - (number y)
訳文x - y 例:1 - 2→-1
integer
(integer x) - (integer y)
訳文x - y 例:1(int) - 2(int)→-1(int)
number
(integer x) - (number y)
訳文x - y。整数と数値が逆でも数値が返ってきます 例:1(int) - 2→-1, 1 - 2(int)→-1
text
(text x) - (text y)
訳文x - y。文字列yが1字のときは、文字列xに含まれるすべての文字列yが取り除かれます 例:"AdvancedCannon" - "Cannon"→"Advanced", "aabbabab"-"b"→"aaaa", "aabbabab"-"bb"→"aaabab"
vector
(vector v) - (vector w)
訳文v - w 例:(1, 2, 3) - (4, 5, 6)→(-3, -3, -3)
vector
(vector v) x (vector w)
訳文v x w。ベクトル積です 例:Forward(0, 0, 1) - Up(0, 1, 0)→(-1, 0, 0) (※Unityでは左手系のため通常とはベクトルの向きが異なること、Z軸が正面であることに注意しましょう)
number
(number x) * (number y)
訳文x * y 例:2 * 3→6

5-1.a,b,c,d,eって何?

インプットの左上から順にa,b,c,d,eの数値に代入されて計算される。
bread6.jpg

5-2.if文の使い方

if(条件, 真のときの値, 偽のときの値) というふうに使う。Switchよりも使いやすい。
下は水深によってピッチ?を調整してみた例。
bread7_1.jpg

5-3.output()の使い方

Bread Board本家ページに詳しく書いてある。
output(1)+1はビークル出現からのフレーム*4数をカウントできて特に便利なので覚えておこう。

5-4. a?b:c構文の使い方

簡単に言うと三項演算子と呼ばれるもので、意味自体はa?b:c=if(a, b, c)と同じ。
プログラムにおいては"if構文"と"三項演算子"で性格が違うため使い勝手が異なるが、FtDのMath Evaluaterにおいては括弧()による可読性の違いで重宝する場合がある。
例えば、if文で入れ子にすると

if(a, b, if(c, d, if(e, f, g)))

のように入れ子×2の数で括弧が増えていって、途中で内側をいじるとどの括弧がどの階層なのか分からないし、実際の式ではa, b, cではなく括弧の絡んだものが入るのでより読みにくいものになる(=可読性の低下)。
一方で、三項演算子では

a ? b : c ? d : e ? f : g

のようになる。結局やってることが複雑なので読みにくいが、if文よりかは読みやすいはず。?と:の間が式なんだと一目で分かるからだ。

5-5. localとparentについて

上記一部関数にはlocal〇〇やparent〇〇といったが引数がある。

6.作成例

6-1.後進ハイドロフォイル

3.2.9にて後進にも対応しました
まず、ブレッドボードを介してハイドロフォイルを操作してみよう。
bread11.jpg
ハイドロフォイルをロール?用に設定し、


bread12.jpg
Orientation/Maths Evaluatorコンポーネントを使って条件分岐を書く。
if文を入れ子にして左ロール・右ロール・何もしないの3つの状態を切り替えている。
if(条件1, 条件1のときの値, if(条件2, 条件2のときの値, どちらでもないときの値)) のように書いている。


ここからさらに後進の場合に対応していこう。
ふつうハイドロフォイルはバックの場合に逆向きの力が出てしまい船のバランスを崩してしまう。
bread13.jpg
符号を求める関数sign()を使って、
後進の場合はハイドロフォイルを逆に操作するようにかけ算をしてやるとうまくいく。
Propulsion(入力版)とPropulsion(出力版)の見た目が紛らわしいので気を付けて。

6-2.PIDの代わり

AIPIDの代わりはできないが、General Purpose PIDの代わりはできる。
bread8_1.jpg
GPPIDでのロール制御をブレッドボードで行うときは、
PID/Orientation/Constantコンポーネントを用いてこのように書くことができる。
bread9_1.jpg
ブレッドボードでは出力値が反転することがあるため、そんなときは設定を左右逆にしておくとよい。


bread10.jpg
さらに計算を加えていくこともできる。
速度が小さいときに、エルロンの効きを強めるように書いた例。


Constantの目指す値の部分にも計算式を入れればより変幻自在に制御をすることができる。
敵の高度に合わせてこちらの高度を調整したり、色々と試してみよう。

コメント

  • 個人的に必要だと思う部分を全力で捕捉しました。分かりやすさのため元ページと書き方がちがう部分がありますのでご注意ください。 -- sosu2357? 2020-12-15 (火) 01:28:36
  • 見やすい!わかりやすい!たのしい!ステキ! -- EMR? 2020-12-15 (火) 21:50:47

*1 AIブレッドボードはこれに加えマニューバとビヘイビアの切り替えができる
*2 元の記事ではノードと書いているところもある
*3 元の記事ではジャンパワイヤと書いているところもある
*4 フレームというのはFtDの最小時間で、1/40=0.025秒