AnimJ

From Neos Wiki
Jump to navigation Jump to search
This page is a translated version of the page AnimJ and the translation is 100% complete.
Other languages:
English • ‎日本語

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"
}