AnimJ
AnimJは、Neosのアニメーションアセットファイル用のカスタムインポートフォーマットです。これにより、任意のアニメーショントラックを外部のJSONファイルとして構築し、Neosネイティブのアニメーションアセットとしてインポートすることができます。これらはAnimatorで値を動かしたり、LogiXノードでサンプルを動かしたりするのに使用できます。
AnimJに関するより専門的で不完全な情報は、ここでも見ることができます。User:Lexevo/Findings/AnimJを参照してください。
構造
それぞれのアニメーションは、1つ以上のアニメーショントラックを持つことができます。Neosでは、目的に応じてさまざまなアニメーション・トラックの種類をサポートしています。また、各アニメーショントラックは、任意のNeos Primitiveを要素として使用することができます。各アニメーショントラックは、一連の値を表す1つまたは複数のキーフレームを持ちます。
アニメーショントラックの典型的な構造は以下の通りです。
{ "name": "My Animation", "globalDuration": 0, "tracks": [ { "trackType": "Discrete", "valueType": "float", "data": { "node": "Test", "property": "Test", "keyframes": [ { "time": 0, "value": 1 }, { "time": 1, "value": 42 }, { "time": 5, "value": 20 } ] } } ] }
以下は、float3型を使ったトラックの例です。
{ "name": "Test Animation Data 1", "globalDuration": 0, "tracks": [ { "trackType": "Discrete", "valueType": "float3", "data": { "node": "TestData", "property": "TestData", "keyframes": [ { "time": 0, "value": { "x": 1.0, "y": 2.0, "z": 3.0 } } ] } } ] }
アニメーショントラック
アニメーショントラックとは、1つのタイムラインのことです。1つのアニメーションには、いくつでもアニメーショントラックを持つことができます。各トラックはノードとプロパティによって一意に識別することができます。
Node は、トラックの階層にあるどのオブジェクトを制御するかを示し、Property は、アニメーションがシーンオブジェクトにバインドされたときに、そのフィールドのどの部分が制御されるかを指定します。例えば、floatQタイプのトラックのNode "Fan Blade"とProperty "Rotation"は、回転アニメーションを制御することができます。
しかし、どちらも単なる名前であり、シーン内の何かに対応する必要はありません。名前を無視してインデックスでアニメーショントラックを参照することもできますし、名前を使ってLogiXで動的に検索することもできます。
アニメーション・トラック・タイプ
Neosは現在、以下のアニメーショントラックタイプをサポートしています。それぞれのタイプは異なるユースケースに最適化されています。アニメーションは異なるタイプのトラックを混在させることができます。
生の(Raw)アニメーショントラック
これは最もシンプルなアニメーションの形式です。これは、グローバルなインターバル(アニメーションの長さ)を持つ、生の値のシーケンスです。キーフレームは、このトラックに一様に配置されます。これは、通常のフレームレートで焼いたアニメーションには理想的な表現です。
これがそのようなアニメーショントラックの例です。
{ "trackType": "Raw", "valueType": "float", "data": { "node": "Test", "property": "Test", "keyframes": [ 0.5, 0.7, 0.8, 0.9 ] } }
ディスクリートアニメーショントラック
このトラックは、キーフレームが不規則で補間を必要としない場合に便利です。それぞれの値は、キーフレームの間、次の値が入ってくるまで保持されます。Neosが字幕をインポートする際のアニメーショントラックのタイプですが、どんな値にも使用できます。Smooth Lerpなどを使って独自の補間を行い、「マスター」の値だけを変更したい場合にも便利です。
{ "trackType": "Discrete", "valueType": "float", "data": { "keyframes": [ { "time": 0, "value": 2 }, { "time": 1, "value": 8 }, { "time": 5, "value": 20 } ], "node": "Test", "property": "Test" } }
カーブアニメーショントラック
最も汎用性の高い(代表的な)タイプのアニメーショントラックで、間に補間を挟む値に使用します。各キーフレームでは、異なるタイプの補間(ホールド、リニア、タンジェント)を使用できます。タンジェント補間のキーフレームでは、左接線と右接線を指定し、次のキーフレームに移行する際にキーフレームの基本値が時間とともにどのように変化するかを示します。
3Dモデルファイルを読み込む際には、このタイプのアニメーショントラックを使用します。
次の例では、キーフレーム間に線形補間を行うCurveアニメーショントラックを示しています。また、離散的なアニメーショントラックも追加されています。
{ "name": "Universe Timing (Czech)", "tracks": [ { "trackType": "Curve", "valueType": "float", "data": { "node": "Scale", "property": "", "keyframes": [ { "time": 0, "value": -17, "interpolation" : "Linear" }, { "time": 49.97, "value": -17, "interpolation" : "Linear" }, { "time": 97, "value": -5, "interpolation" : "Linear" }, { "time": 128, "value": 0, "interpolation" : "Linear" }, { "time": 134, "value": 0, "interpolation" : "Linear" }, { "time": 152, "value": 5.5, "interpolation" : "Linear" }, { "time": 175, "value": 7, "interpolation" : "Linear" }, { "time": 184, "value": 7.5, "interpolation" : "Linear" }, { "time": 207, "value": 12, "interpolation" : "Linear" }, { "time": 247, "value": 27, "interpolation" : "Linear" } ] } }, { "trackType": "Discrete", "valueType": "int", "data": { "node": "Phase", "property": "", "keyframes": [ { "time": 0, "value": 0 }, { "time": 45, "value": 1 }, { "time": 49.97, "value": 2 }, { "time": 247, "value": 3 } ] } } ] }
接線を持つキーフレーム(ベジェ曲線を定義する)の構造は以下の通りです。
{ "time": 10, "value": 0, "leftTangent" : -10, "rightTangent" : 5, "interpolation" : "Tangent" }