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

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 人の人類であるクラスのインスタンスを作成して、メソッドを呼び出す必要があります。MAXScript 擬似コードでは次のようになります。

擬似コード:

theHuman = Bulgarian()--create an instance of the class Bulgarian
theHuman.name ="Bobo"--give it a funny 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 または Dog が必要です、取得: 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

関連事項