On this page

概要

エージェントを以下のように動かしたい場合…

  • 妨げられない限り、前方へ動く。

  • 障害物に近づいた場合、スペースがあれば左または右へ曲がる。

  • スペースがない場合、速度を落として停止する。

この挙動をブール論理を使って定義しようとすると、“パスがどのようにブロックされるか”, “十分なスペースの大きさとはどのくらいか”, “どのくらい曲がるのか”などの難しい定義をすぐに考え出す必要があります。 例えば、障害物が20m以下の距離にある場合を“ブロックする”と考えると、エージェントは20.1mの距離にある障害物に反応しません。

ファジィ論理では、20mの距離には、1の“ブロック”値があり、40mの距離には、0の“ブロック”値があると考えることができます。20mの距離での“ブロックなし”から“ブロック”への明確な切り替えではなく、 40mから20mまでの距離には、“ブロックの度合い”の増加勾配があることになります。

ファジィ論理の基本

ファジィ論理 は、複雑な群衆挙動の構築に役立つツールです。 ブール論理では、各変数はfalseかtrueのどちらかですが、ファジィ論理では、0(完全にfalse)と1(完全にtrue)の間で考えられる真理値の範囲を許容します。 これにより、障害物に対して比較的形式張らない反応の仕方などの挙動を指定することができます。

ファジィ集合

ブール論理では、ステートメントはfalseかtrueのどちらかです。 例えば、“Xは背が高い”というステートメントは、trueまたはfalseになり…Xは背が高い、または背が高くないということになります。 ステートメントをテスト可能にするために、例えば180cmという区切りを設定すると、180cm以上の身長のみを“背が高い”と言うことができます。

しかし、これでは我々が実際に現実で考えている方法に合っていません。これは、(例えば179cmと180cmの)極めて身長が近い2人を“背が低い”および“背が高い”と分けるような直観的でない状況になってしまいます。 我々は、明確な区別を行なわずに、様々な度合い(例えば、“高くない”, “高い方”, “やや高い”, “非常に高い”など)で“背が高い”と考えます。“背が高い”という我々の概念が ファジィ です。

truth
height

ファジィ論理では、ステートメントは 真の度合い をとることができます。 これは、入力値(例えば身長)を取得し、“Xは背が高い”というステートメントが指定された身長に対して、 どの程度、真であるか を表現する 真理値 を出力する関数として表現することができます。 例えば、1.6mの身長はやや“背が高い”が、1.8mほど高くないということになります。

また、 Xは“背が高い”という集合のメンバーである度合い として考えることもできます。

truth
height

単一の入力値は、いろいろな度合いで複数の集合のメンバーとなることができます。 例えば、3個の集合: “short”, “medium”, “tall”を設定することができます。これは、指定した値からメンバーシップを決定するのに3つの関数を持ちます。

メンバーシップは重複が可能です。例えば、Xは同時に“0.1 short且つ0.9 medium”になることができます。(物事を理解しやすくするために、異なる集合の真理値は、常に合計が1になります。)

truth
height

入力値を集合毎にそれらの真理値に変換することを入力のファジィ化と言います。

規則

if…then 規則により、最初のメンバーシップから他の集合のメンバーシップを派生することができます。 例えば、電車の制御システムを構築している場合を考えてみます。 乗客の乗り心地を保証するために、電車のブレーキ加速度が、電車から前方の次の電車までの距離および電車の現行速度から決まるようにします。

2個の 入力 ファジィ変数: distancespeed を設定します。

  • distanceは、電車から次の電車までの距離です。距離のファジィ集合は、 near , medium , far です。

  • speedは、電車の現行速度です。速度のファジィ集合は、 slow , normal , fast です。

派生した ファジィ変数: braking を設定します。brakingは、distancespeedから計算されます。brakingは、 none , low , medium , high のファジィ集合のメンバーとなることができます。

以下の規則により、speeddistancebrakingに変換します:

If…

Then

speed is fast and distance is close

braking is high

speed is not slow and distance is far

braking is low

speed is normal and (distance is close or distance is medium)

braking is medium

else

braking is none

ブール論理がAnd, Or, Notを使用することでtrue/false値を組み合わせることができるのと同様に、 ファジィ論理には、それと同等のFuzzy And, Fuzzy Or, Fuzzy Not演算があります。 ファジィ入力とファジィ演算子を組み合わせて、ファジィ集合を出力します。 例えば、指定したspeedとdistanceで上記の規則を出力すると、braking変数は、“0 none, 0.1 low, 0.7 medium, 0.2 high”になります。

出力の非ファジィ化

ほとんどの場合、集合のメンバーシップが分かっても、挙動の指示には役に立ちません。 それよりむしろ、どこかで使用できる具体的な数字が必要です。 上記の電車のブレーキのサンプルでは、ファジィブレーキ集合を、ブレーキに適用するフォース量(例えば、0-100の範囲)に対する単一の数字に置き換える必要があります。

非ファジィ化は、ファジィ集合のメンバーシップを取得して、 クリスプ 値(明確な値)に変換するプロセスです。 例えば、ファジィbraking変数が、“0 low, 0.2 medium, 0.7 high”の場合、これは、braking = 60というクリスプ出力(明確な出力)に変換されます。

非ファジィ化は、ファジィ集合の統合を伴います。 Houdiniでは、この統合をするのに2つのメソッドがあります: 最も強い真理値を持つ関数(maximum)を使用、またはメンバーシップ関数を合算(sum)することです。

統合前に、各メンバーシップ関数は、そのファジィ集合の真理値によりクリップされます。真理値よりも大きい値は、真理値に制限されます。

つまり、統合されたファジィ集合は、システム(定義されたメンバーシップ関数)と入力(各集合の真理を推測する変数)の両方の関数です。

統合集合は、このグラフのようにポリゴンとして生じます。Houdiniは、グラフの重心を取り、クリスプ出力値を取得します。

Houdiniのファジィ論理

Houdiniでは、VOPを使用して、ファジィ論理のネットワークを作成することができます。 例えば、POP VOP DOP内のファジィ論理ノードを使用して、群衆シミュレーションでエージェントに対するアトリビュートを制御することができます。

  • Fuzzy Input VOPを作成して、クリスプ入力変数をファジィ化します。入力は、通常、速度, 近接度, またはBind VOPによりインポートするターゲットまでの距離などのエージェントアトリビュートです。Fuzzy Inputノードは、各アトリビュートをファジィ集合に変換します。

    Fuzzy Inputノードのランプパラメータを使用して、ファジィ集合のメンバーシップ関数を設定することができます。ノードには、一般的に使用される関数に対して、いくつかのランププリセットがあります。

  • Fuzzy Inputの出力は、ファジィ値の浮動小数点(集合メンバーシップ強度)で、メンバーシップ関数と強度の両方を持つFuzzySet構造体です。

    Fuzzy And, Fuzzy Orネットワークによるファジィ値と、規則の“if”部分を表すFuzzy Not VOPを接続します。例えば、“if fast and near…”となります。

  • 論理ネットワークの出力をFuzzy Inference VOP内に接続します。このノードは、その入力に基づいて新しい集合を生成します。これは、規則の“then”の部分を表します。

    電車のブレーキのサンプルでは、ネットワークの“if fast and near…”の部分を、ファジィブレーキ変数highの強度を推測する推理ノードへ接続することになります。つまり、fastnearの強度は、ブレーキhighの強度を意味します。

    他の論理を接続すると、他のファジィ出力変数が作成されます。例えば、normalの速度とnearまたはmidの近接度は、mediumのブレーキを意味します。

    これは、ネットワークが決めているのではない部分であることに留意してください。 例えば、ブレーキは、high, low, またはmediumのいずれかになります。 現行の入力のメンバーシップの強度がhigh, medium, またはlowの集合にあるかを計算しています。

  • ファジィ集合をクリスプ値に非ファジィ化するには、推測されたFuzzySet構造体をFuzzy Defuzz VOP内へ接続します。ファジィネットワークから計算したいそれぞれのクリスプ変数に対して、Fuzzy Defuzzが設定されます。

    Fuzzy Defuzzには、 Aggregation method のパラメータがあり、ファジィ入力を どのように クリスプ値に変換するかを制御します。

Fuzzy VOP

以下のVOPにより、ファジィ論理ネットワークを実装することができます。

Fuzzy Input VOP

クリスプ入力を、単一のファジィ集合に対する真理値にファジィ化します。このノードにより、新しい集合用にプリセットのメンバーシップ関数の集合から選択したり、ランプパラメータによりカスタムのカーブを描くことができます。

Fuzzy Inputは、真理値(0-1間の浮動小数点)と、(範囲, メンバーシップ関数, 真理値などの)ファジィ集合に関する情報を含むFuzzySet構造体を出力します。

Fuzzy And Fuzzy Or Fuzzy Not

ファジィ変数を組み合わせます。これらの演算のネットワークは、規則の“If”の部分に対応します。出力は 規則の強度 です。

Fuzzy Inference VOP

新しいファジィ集合を派生します。このノードは、規則の“Then”の部分に対応します。

Fuzzy Inferenceは、(最大または合計)関数により、複数の規則の強度を統合することができます。

そして、規則の強度およびメンバーシップ関数を使用して、新しいファジィ集合で真理値を導きます。このノードは、真理値と新しいファジィ集合に関する情報を含むFuzzySet構造体を出力します。

Fuzzy Inference Mirror

Fuzzy Inferenceに似ていますが、 2個 の新しいファジィ集合を作成します: つまり、Fuzzy Inferenceとその逆数から作成されます。これは、trueの度合いに基づく挙動もあれば、trueでない度合いに基づく挙動もあるという状況が必要な場合に役立ちます。

Fuzzy Defuzz

FuzzySet入力をクリスプ出力に非ファジィ化します。

ファジィ入力としてのセンスの使い方

Fuzzy Obstacle Sense VOPは、エージェントの正面の視野の円錐内に、いくつかの光線を最大距離まで送出します。これにより、距離の配列が作成されます。

便宜上、ヒットの距離は、最大値から減算されるため、近くでヒットすると数字が大きくなり、外れると0です。

このサンプルでは、3個の光線がエージェントの近くでヒットし、2個が外れ、{20, 60, 0, 0, 30}という配列が作成されています。

Fuzzy Obstacle Senseにより作成された配列をFuzzy Input VOPに接続することができます。Fuzzy Inputノードは、関数またはランプパラメータを使用して、配列の値にウェイトをかけ、それらを単一の真理値とファジィ集合へ変換します。

このサンプルでは、赤いバーは、センサーノードからの“近さ”値の配列です。 “Left Side is Blocked”のファジィ集合を作成するには、右側の角度よりも左側の角度に大きくウェイトをかけるランプを描きます。 Fuzzy Inputノードは、基本的に、カーブの下に残っている領域によりバーの領域を分割し、単一の真理値を取得します。

群衆シミュレーション

はじめよう

  • 基本

    Houdiniにおける群衆シミュレーションの考え方の概要を説明します。

  • セットアップ

    群衆シミュレーションのセットアップと編集の方法

動くパーツ

  • エージェント

    群衆シミュレーションの要員である動くアクターであるエージェントについて説明します。

  • ステート

    各エージェントのアニメーションや仕草を制御する仮想的な雰囲気。

  • トリガー

    エージェントの状態を変更する条件を指定する方法です。

  • キャッシュ

    群衆シミュレーションの効率的なキャッシュ化と読み込みのTips。

挙動

外観

  • 多様性

    エージェントに異なる外観と行動を作成することで、より現実的な群衆を作成する方法。

  • 布の取り付け

    Vellum Clothをエージェントシェイプジオメトリの一部として追加/拘束すれば、エージェントの動きに基づいて布をシミュレーションすることができます。

地形

  • 足の着地

    エージェントのアニメーションを地形に適応させて滑りを回避するためのセットアップ方法。

  • 地形

    エージェントが歩く地形ジオメトリを指定する方法です。

  • 障害物

    エージェントが回避する障害物を設定する方法です。