クラスとクラス インスタンスのすばらしい世界

MAXScript に関する質問と回答 クラスとクラス インスタンスのすばらしい世界

質問:

RenderEffects のオンとオフを切り替えられるようにしたいのですが、このことが可能なのかどうかがわかりません。

MAXScript ヘルプ ファイル構文の機能を正確に理解しようとしています。次のように < > 記号で囲まれている場合、それにはどんな意味があるのでしょうか。

setActive <renderEffect> <boolean>

setActive がコマンドで、boolean が true または false フラグであることはわかりますが、renderEffect には何が必要でしょうか。そのコマンドは実際にどのように記述されるのでしょうか。

このコマンドを次のように使用してみました。

setActive blur true
setActive blur false

これは、次のエラー状態のため、使用できないようです。

-- Runtime error: Invalid object, needed Atmospheric or Effect, got: blur

OOP オブジェクトに関して何を指定すればよいですか。

回答:

このヘルプ ファイルで使用する構文定義」に次のように記述されています。

<rule> -- you can insert what is defined by the named rule

したがって、<boolean> と記述されている場合は、ブール値を評価する式が必要です。また、シンボル「True」または「False」を必要とするだけではなく、シンボル「True」および「False」によって表現される値を導く式も必要であることを意味します。<boolean> の代わりに、ブール値を含む変数、myValue >= 10.5 のような式、ブール値を返す MAXScript メソッド(selection[1].isHidden など)を使用できます。

<renderEffect> については、renderEffect オブジェクト値が必要です。3ds Max はオブジェクト指向プログラムであるため、ほとんどのビルディング ブロックは OOP での意味のオブジェクトです。同様に、MAXScript を使うとオブジェクト クラスのインスタンスを構築できます。

たとえば、MAXScript ヘルプによれば、b=box() はクラス Box のインスタンスを作成し、値を返します。その値は変数 b に格納され、<Node> が必要とされる場所で使用できます。

renderEffect スーパークラスの lens_effects クラスのインスタンスを作成する場合、返されるオブジェクトは、シーン ノードではなく、OOP での意味のオブジェクトであり、そのスーパークラスが setActive メソッドによって要求されるオブジェクトのタイプに一致するため、上記の規則に適合します。

たとえば、これを人間に置き換えて考えてみましょう。

オブジェクトのクラスは、人間の国籍と考えることができます。

スーパークラスは、種と考えることができ、この場合は HumanBeing です。

たとえば、ブルガリアで人間を出産する場合は、クラスが Bulgarian、スーパークラスが HumanBeing のインスタンスを作成することに相等します。

クラスとスーパークラスは、オブジェクトのタイプの一般的な説明ですが、オブジェクトそのものではありません。メソッド「Kiss」を人類に適用する場合、民族にキスすることはできないので、「Kiss Bulgarian」を使用することはできません。メソッドを呼び出すには、そのクラスの 1 つのインスタンス、つまり人類の 1 人が必要です。MAXScript 擬似コードでは次のようになります。

擬似コード:

theHuman = Bulgarian()--create an instance of the class Bulgarian
theHuman.name ="Bobo"--give it a name
print (superclassof theHuman)
--> HumanBeing
if theHuman.location =="Winnipeg" do
theHuman.isFrozen = true--set some properties based on object's location
-- Now you have a single instance you can call a method
-- that expects an object of the superclass HumanBeing:
Kiss theHuman

「Kiss Bulgarian」を使用すると、擬似 MAXScript では、次のようなエラーが発生します。

-- ランタイム エラー: 無効なオブジェクト、HumanBeing が必要です、取得: Bulgarian

これは、Bulgarian がオブジェクトではなく、オブジェクトのカテゴリを記述するクラスだからです。

オブジェクト指向プログラミングの考え方は、より一般的なクラスから継承されるオブジェクトの共通のクラスを持つことで、このプログラミングでは、上位のクラス階層の一般的なプロパティや機能をすべて継承するクラスのインスタンスを任意の数だけ作成することができます。

このため、次のようなクラス階層を持つことができます。

LifeForm > EarthInhabitant > Mammal > HumanBeing > Caucasian > Bulgarian

最初のより一般的なクラスは、生命体の共通の機能を定義します。呼吸をしたり水の中を泳いだり、ミルクを飲んだりすること、2 本足の生き物であること、出自と肌、髪、および目の色の共通プロパティ、言語、出身地などを定義します。

さらに、関心のあるクラスのインスタンスを作成して、上記のようにオブジェクトに適用するメソッドを使用する必要があります。

RenderEffects の場合は、クラス Blur 自体ではなく、ブラー効果のインスタンスが必要です。通常、オブジェクトがシーン内に存在する場合は、次のように呼び出して既存のオブジェクトを変数内に取得します。

myEffect = getEffect 1--returns the first effect on the RenderEffects list
setActive myEffect false--disables it

または、中間変数を使用しないで短縮することもできます。

setActive (getEffect 1) false

シーン内のすべての効果を無効にするには、次のようにすることもできます。

for i = 1 to NumEffects do setActive (getEffect i) false

関連事項