コントローラ キー関数

addNewKey <controller> <time> [#select]      

指定された時間のコントローラ トラックに新規キーを追加します。新規キーの値は、指定された時間に補間されたコントローラ値です。#select オプション引数が指定されると、新規キーも選択されます。新規キーの値は、指定された時間に補間されたコントローラ値です。addNewKey() は、指定された時間に既にキーが存在する場合には、キーを追加しません。この場合の戻り値は、指定された時間に位置するキーです。

注: コントローラが複合コントローラ(Position_XYZ コントローラなど)の場合は、OK の値が返されます。addNewKey はサブコントローラごとにキーを作成するため、単一のキー値を返すことはできません。

この関数は、そのキーを表す MAXKey 値を返すので、その値をさまざまなプロパティに設定できます。詳細は、「MAXKey 値」を参照してください。

deleteKeys <controller> [#allKeys | #selection]   

必要に応じて指定した記号引数により、コントローラからキーを削除します。

#allKeys (既定値): コントローラ内のすべてのキーを削除します。

#selection : 現在選択されているキーを削除します。

deleteKey <controller> <index> 

インデックスで指定されたキーを削除します。キー インデックスは、基数 1 です。

selectKeys <controller> [ <interval> | <time> ] 

トラック ビュー内の指定されたキーを選択します。間隔が指定されていれば、その間隔内のすべてのキーが選択されます。時間が 1 つ指定されていれば、その時間上のキーが選択されます。時間も間隔も指定されていなければ、すべてキーが選択されます。

deselectKeys <controller> [ <interval> | <time> ] 

指定したキーの選択を解除します。引数については、selectKeys() の場合と同様です。

selectKey <controller> <index_integer> 

インデックスで指定されたキーを選択します。キー インデックスは、基数 1 です。

isKeySelected <controller> <index_integer> 

インデックスで指定されたキーが選択されている場合は true を、それ以外の場合は false を返します。キー インデックスは、基数 1 です。

deselectKey <controller> <index_integer> 

インデックスで指定されたキーの選択を解除します。キー インデックスは、基数 1 です。

moveKeys <controller> <time> [#selection] 

指定された時間だけ指定したキーを移動します。#selection が指定されている場合はその時点の選択を移動し、指定されていない場合はすべてのキーを移動します。moveKeys 関数は、トラックのプロパティ .controller および .track でのみ機能します。この関数は、キーの仮想配列では定義されません。

警告:

キーを移動して、後続のキー時間と一致する時間または超過する時間に設定すると、タイムラインにエラーが発生し、3ds Maxがクラッシュする可能性があります。この問題が起こらないよう、キーを移動した後で sortKeys() を呼び出すようにしてください。2 つのキーを同じ時間値に設定する動作は定義されていないため、使用しないでください。

例:

moveKeys $box01.pos.controller 5
moveKeys $box01.pos.track 5
moveKey <controller> <index_integer> <time> 

指定された時間だけインデックスで指定されたキーを移動します。

警告:

キーを移動して、後続のキー時間と一致する時間または超過する時間に設定すると、タイムラインにエラーが発生し、3ds Maxがクラッシュする可能性があります。この問題が起こらないよう、キーを移動した後で sortKeys() を呼び出すようにしてください。2 つのキーを同じ時間値に設定する動作は定義されていないため、使用しないでください。

numKeys <controller> 

コントローラ内のキーの数を返します。キーフレーム処理をサポートしていないコントローラ上で呼び出した場合は、-1 を返します。

getKey <controller> <index_integer> 

インデックス付きキーを MAXKey インスタンスとして返します。MAXKey クラスについては、「コントローラ キー関数」を参照してください。

getKeyTime <controller> <index_integer> 

インデックスで指定されたキーの時間を返します。

getKeyIndex <controller> <time> 

指定された時間のキーのインデックスを返します。

numSelKeys <controller> 

トラック ビュー内でその時点で選択されているキーの数を返します。

sortKeys <controller> 

キーを、その時間によりソートし直します。MAXKey 演算を行うとキーの順番が不適切になる場合があるため、この関数を呼び出してキーを正しく並べ替える必要があります。MAXKey のプロパティについては、「コントローラ キーとキー プロパティ」を参照してください。

createLockKey <controller> <time> <rot_or_pos_integer> 

このメソッドは、指定された時間にロックするキーを作成するために呼び出されます。このキーは前のキーを確認し、指定された時間に前のキー値と同じ値を使って新規キーを作成します。また、前のキーと新規キーの値が同じになるように、キーのパラメータも調整します。たとえば、TCB コントローラでは、前のキーと新規キーの連続性は 0 に設定されます。ベジェ コントローラでは、前のキーのアウト接線タイプと新規キーのイン接線タイプは線形に設定されます。

このメソッドに渡されるコントローラが変換レベル コントローラである場合、<rot_or_pos_integer> は、変換コントローラ内の位置または回転(またはロール角度)のいずれのサブコントローラ内でキーを作成するかを指定します。rot_or_pos_integer が 0 の場合、キーは位置コントローラ内で作成されます。それ以外の値の場合、キーは回転(またはロール角度)コントローラ内で作成されます。

このメソッドに渡されるコントローラが変換レベル コントローラでない場合、<rot_or_pos_integer> 値は使用されません。

キーの作成に成功した場合は true を、それ以外の場合は false を返します。

次のスクリプトは、上記メソッドの使用例を示しています。

例:

-- controller test bed 2
b=box height:10
at time 5 animate on b.height=50
at time 10 animate on b.height=100
bhc=b.height.controller
bhk=bhc.keys
addnewkey bhc 7
addnewkey bhc 9
for k in bhk do format "%:%\n" k.time k.value
selectKeys bhc (interval 7 9)
deleteKeys bhc #selection
bhk
addnewkey bhc 7
addnewkey bhc 9
selectKeys bhc (interval 7 9)
deleteKeys bhc #selection #slide
bhk
addnewkey bhc 7
addnewkey bhc 9
selectKeys bhc (interval 7 9)
deleteKeys bhc #selection #slide #rightToLeft
bhk
addnewkey bhc 8
i=getKeyIndex bhc 8
selectKey bhc i
moveKey bhc i 10
bhk
getKeyTime bhc 4
b.width.controller=noise_float()
numkeys b.width.controller
appendKey <key_array> <max_key> 

所定のキーを、指定されたキー配列のキーの元の時間に追加します。

--Create a Box and a Sphere
source_obj = box()
target_obj = sphere()
-- Animate the position of the Box on frames 50 and 100.
with animate on
(
at time 50 source_obj.pos.controller.x_position = 100
at time 100 source_obj.pos.controller.x_position = 200
)
--Animate the position of the Sphere on frames 40 and 80
with animate on
(
at time 40 target_obj.pos.controller.x_position = 50
at time 80 target_obj.pos.controller.x_position = 60
)
--Print keys of both controllers
format "Source Keys X Pos: %\n"source_obj.pos.x_position.controller.keys
format "Target Keys X Pos: %\n"target_obj.pos.x_position.controller.keys
--Get the 2nd key from the X axis controller of the position transformation
source_key = source_obj.pos.x_position.controller.keys[2]
--Get the X axis position controller keys array of the target object
target_keys = target_obj.pos.x_position.controller.keys
--Assign the key from the source to the target controller
appendKey target_keys source_key
--The Sphere now has a 3rd key on frame 50 with the value 100
format "Target Keys After appendKey: %\n" target_obj.pos.x_position.controller.keys

出力

$Box:Box008 @ [0.000000,0.000000,0.000000]
$Sphere:Sphere001 @ [0.000000,0.000000,0.000000]
200
60
Source Keys X Pos: #keys(0f, 50f, 100f)
OK
Target Keys X Pos: #keys(0f, 40f, 80f)
OK
#Bezier Float key(2 @ 50f)
#keys(0f, 40f, 80f)
#Bezier Float key(3 @ 50f)
Target Keys After appendKey: #keys(0f, 40f, 50f, 80f)
OK
assignKey <key_array> <max_key> <index> 

<index> で指定されたキーをターゲット キー配列から削除し、ソース キーをターゲット キー配列のソース キーの時間に挿入します。

注:

最初にソース キーが で指定されたターゲット キーを上書きし、生成された配列が時間でソートされます。結果は上記と同じです。

--Create a Box and a Sphere
source_obj = box()
target_obj = sphere()
-- Animate the position of the Box on frames 50 and 100.
with animate on
(
at time 50 source_obj.pos.controller.x_position = 100
at time 100 source_obj.pos.controller.x_position = 200
)
--Animate the position of the Sphere on frames 10 and 20
with animate on
(
at time 10 target_obj.pos.controller.x_position = 50
at time 20 target_obj.pos.controller.x_position = 60
)
--Print keys of both controllers
format"Source Keys X Pos: %\n" source_obj.pos.x_position.controller.keys
format"Target Keys X Pos: %\n" target_obj.pos.x_position.controller.keys
--Get the 2nd key from the X axis controller of the position transformation
source_key = source_obj.pos.x_position.controller.keys[2]
--Get the X axis position controller keys array of the target object
target_keys = target_obj.pos.x_position.controller.keys
--Assign the key from the source to the target controller,
--delete original sourcekey 3
assignKey target_keys source_key 3
--The Sphere now has a 3rd key on frame 50 with the value 100,
--original 3rd key on frame 20 has been deleted:
format "Target Keys After assignKey: %\n" target_obj.pos.x_position.controller.keys

リスナー出力

$Box:Box009 @ [0.000000,0.000000,0.000000]
$Sphere:Sphere002 @ [0.000000,0.000000,0.000000]
200
60
Source Keys X Pos: #keys(0f, 50f, 100f)
OK
Target Keys X Pos: #keys(0f, 10f, 20f)
OK
#Bezier Float key(2 @ 50f)
#keys(0f, 10f, 20f)
#Bezier Float key(3 @ 50f)
Target Keys After assignKey: #keys(0f, 10f, 50f)
OK
注:

appendKeyassignKey は、キーフレームを直接サポートするコントローラでのみ機能します。同じタイプのソースとターゲットが必要になります。コントローラ レベル プロパティ <control>.supportsKeys (ブール値、読み取り専用)は、コントローラに I_KEYCONTROL インタフェースが実装され、appendKey および assignKey 関数の引数として使用できる場合は true を返します。「supportsKeys」を参照してください。

コントローラ間でキーをコピーするには:

copyPasteKeys <controller> (<map_struct> | <fn> <arg>) [#replacekeys] [#insertkeys] 

この関数は既存の mapKeys() メソッドによく似ていますが、いくつかのキーが選択されていることを前提としています。copyPasteKeys(), を呼び出すと、「mapKeys() メソッド」で説明されている map_struct またはマッピング関数が使用され、選択されているキーが最初にコピーされてから、コピーされたキーが選択されて貼り付けられます。3ds Max 8 以降で使用可能です。

#replacekeys 引数を使用すると、コピーされたキーの範囲内にある未選択キーが削除されます。さらに、#insertkeys 引数を使用すると、コピーされたキーの範囲の長さに等しい時間の値で、コピーされたキーの挿入点(最初にコピーされたキーの場所)以後に配置されている未選択キーが右にシフトされます。