{ "X3D": {
    "encoding":"UTF-8",
    "@profile":"Immersive",
    "@version":"3.3",
    "@xsd:noNamespaceSchemaLocation":"http://www.web3d.org/specifications/x3d-3.3.xsd",
    "JSON schema":"https://www.web3d.org/specifications/x3d-4.0-JSONSchema.autogenerated.json",
    "head": {
        "meta": [
          {
            "@name":"title",
            "@content":"WinterAndSpringHumanoidTimings.x3d"
          },
          {
            "@name":"description",
            "@content":"Example animation timings, manually translated from tool outputs and export."
          },
          {
            "@name":"reference",
            "@content":"https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/HumanoidAnimation/WinterAndSpring/originals/WinterAndSpringHumanoidTimings.x3dv"
          },
          {
            "@name":"info",
            "@content":"reference .x3dv model successfully translated by Castle Game Engine, IICM, and Xj3D import (with loss of comments)"
          },
          {
            "@name":"creator",
            "@content":"Katy Schildmeyer"
          },
          {
            "@name":"creator",
            "@content":"Carol McDonald"
          },
          {
            "@name":"translator",
            "@content":"Joe Williams"
          },
          {
            "@name":"translator",
            "@content":"Don Brutzman"
          },
          {
            "@name":"created",
            "@content":"2 July 2023"
          },
          {
            "@name":"translated",
            "@content":"9 July 2023"
          },
          {
            "@name":"modified",
            "@content":"19 September 2023"
          },
          {
            "@name":"hint",
            "@content":"MetadataString approach for name=poses sequence, matching the key/keyValue pairs, is experimental but seems unambiguous."
          },
          {
            "@name":"identifier",
            "@content":"https://www.web3d.org/x3d/content/examples/HumanoidAnimation/WinterAndSpring/WinterAndSpringHumanoidTimings.x3d"
          },
          {
            "@name":"generator",
            "@content":"Cinema 4D https://www.maxon.net/en/cinema-4d"
          },
          {
            "@name":"generator",
            "@content":"X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit"
          },
          {
            "@name":"license",
            "@content":"../license.html"
          },
          {
            "@name":"translated",
            "@content":"15 April 2026"
          },
          {
            "@name":"generator",
            "@content":"X3dToJson.xslt, https://www.web3d.org/x3d/stylesheets/X3dToJson.html"
          },
          {
            "@name":"reference",
            "@content":"X3D JSON encoding: https://www.web3d.org/wiki/index.php/X3D_JSON_Encoding"
          }
        ]
    },
    "Scene": {
        "-children":[
          { "WorldInfo":
            {
              "@title":"WinterAndSpringHumanoidTimings.x3d"
            }
          },
          { "Viewpoint":
            {
              "@DEF":"EntryView1",
              "@description":"Hello characters 1",
              "@position":[0,2,40]
            }
          },
          { "Viewpoint":
            {
              "@DEF":"EntryView2",
              "@centerOfRotation":[0,10,10],
              "@description":"Hello characters 2",
              "@orientation":[0,1,0,-0.643501],
              "@position":[-15,10,30],
              "-children":[
                {
                  "#comment":"local lookat point: 0 10 10"
                }
              ]
            }
          },
          { "Transform":
            {
              "@DEF":"TextRoot",
              "-children":[
                { "Shape":
                  {
                    "@DEF":"ModelDescriptionText",
                    "-geometry":
                      { "Text":
                        {
                          "@string":["This scene tests","experimental approaches","for human animation"],
                          "-fontStyle":
                            { "FontStyle":
                              {
                                "@family":["SANS"],
                                "@justify":["MIDDLE","MIDDLE"],
                                "@size":0.8,
                                "@style":"BOLD"
                              }
                            }
                        }
                      },
                    "-appearance":
                      { "Appearance":
                        {
                          "-material":
                            { "Material":
                              {
                                "@diffuseColor":[0.960784,0.894118,0]
                              }
                            }
                        }
                      }
                  }
                }
              ]
            }
          },
          { "Transform":
            {
              "@DEF":"Root4"
            }
          },
          { "Transform":
            {
              "@DEF":"Root5"
            }
          },
          { "Transform":
            {
              "@DEF":"Root6"
            }
          },
          {
            "#comment":"WinterAndSpringHumanoidTimings"
          },
          {
            "#comment":"Gramps_humanoid root is at 0 0.875 0 at start, now at given x and z with root now changed in height to 0.95 to #add pathway height. The actual Gramps height (y) may be slightly different but use this value for now."
          },
          { "PositionInterpolator":
            {
              "@DEF":"Gramps_HumanoidRoot_TranslationInterpolator",
              "@key":[0,0.09,0.11,0.22,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[6.8557,0.95,0.5,6.8557,0.95,0.5,6.8557,0.95,0.5,9.8557,0.95,3.5,9.8557,0.95,3.5,9.8557,0.95,3.5,14.3558,0.95,8.0,16.8558,0.95,15.0,21.3557,0.95,24.5,21.3557,0.95,24.5,21.3557,0.95,24.5],
              "-metadata":
                { "MetadataString":
                  {
                    "@name":"poses",
                    "@value":["Gramps_Stand01","Gramps_Stand01","Gramps_Walk01","Gramps_Stand02","Gramps_Turn01","Gramps_Walk01","Gramps_Walk02","Gramps_Skip01","Gramps_Stand03","Gramps_Stand03","Gramps_Stand03"]
                  }
                }
            }
          },
          { "PositionInterpolator":
            {
              "@DEF":"Leif_HumanoidRoot_TranslationInterpolator",
              "@key":[0,0.09,0.11,0.223,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[-7.9962,0.400,3.000,-7.9962,0.400,3.000,-7.9962,0.400,3.000,-7.9962,0.400,3.000,9.004,0.475,3.4999,11.5048,0.475,3.3699,16.0038,0.475,7.8699,18.5038,0.475,14.8699,23.0038,0.475,24.3699,23.0038,0.475,24.3699,23.0038,0.475,24.3699],
              "-metadata":
                { "MetadataString":
                  {
                    "@name":"poses",
                    "@value":["Leif_Stand01","Leif_Stand01","Leif_Stand01","Leif_Run01","Leif_Turn01","Leif_Walk01","Leif_Walk01","Leif_Skip01","Leif_Stand01","Leif_Stand01","Leif_Stand01"]
                  }
                }
            }
          },
          { "PositionInterpolator":
            {
              "@DEF":"Lily_HumanoidRoot_TranslationInterpolator",
              "@key":[0,0.09,0.11,0.225,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[-8.0962,0.400,5.600,-8.0962,0.400,5.600,-8.0962,0.400,5.600,-8.0962,0.400,5.600,8.9038,0.475,4.0999,10.6538,0.475,3.3499,15.1538,0.475,7.8499,17.6538,0.475,14.8499,22.1538,0.475,24.3499,22.1538,0.475,24.3499,22.1538,0.475,24.3499],
              "-metadata":
                { "MetadataString":
                  {
                    "@name":"poses",
                    "@value":["Lily_Stand01","Lily_Stand01","Lily_Stand01","Leif_Run01","Lily_Turn01","Lily_Walk01","Lily_Walk01","Lily_Skip01","Lily_Stand01","Lily_Stand01","Lily_Stand01"]
                  }
                }
            }
          },
          { "PositionInterpolator":
            {
              "@DEF":"Tufani_HumanoidRoot_TranslationInterpolator",
              "@key":[0,0.09,0.11,0.227,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[-8.0962,0.400,6.400,-8.0962,0.400,6.400,-8.0962,0.400,6.400,-8.0962,0.400,6.400,9.40338,0.475,4.3999,9.1538,0.475,3.2699,13.6538,0.475,7.7699,16.1538,0.475,14.7699,20.6538,0.475,24.2699,20.6538,0.475,24.2699,20.6538,0.475,24.2699],
              "-metadata":
                { "MetadataString":
                  {
                    "@name":"poses",
                    "@value":["Tufani_Stand01","Tufani_Stand01","Tufani_Stand01","Tufani_Run01","Tufani_Turn01","Tufani_Walk01","Tufani_Walk01","Tufani_Skip01","Tufani_Stand01","Tufani_Stand01","Tufani_Stand01"]
                  }
                }
            }
          },
          {
            "#comment":"Now add Background nodes with corresponding timing, as controlled by an identical key array"
          },
          {
            "#comment":"TODO are we missing Background1 and Background2?"
          },
          {
            "#comment":"This is black for all"
          },
          { "Background":
            {
              "@DEF":"Background3Black"
            }
          },
          {
            "#comment":"This is blue sky and green grass"
          },
          { "Background":
            {
              "@DEF":"Background4SkyBlueGreenGrass",
              "@groundAngle":[1.57],
              "@groundColor":[0.356863,0.639216,0,0.721569,1,0.501961],
              "@skyColor":[0,0.71,0.886]
            }
          },
          {
            "#comment":"This is light gray sky and green grass"
          },
          { "Background":
            {
              "@DEF":"Background5LightGrey",
              "@skyColor":[0.827,0.827,0.827]
            }
          },
          {
            "#comment":"This is black background and white text for all"
          },
          { "Background":
            {
              "@DEF":"Background6DarkGrey",
              "@skyColor":[0.6,0.2,0.2]
            }
          },
          {
            "#comment":"Animation controls"
          },
          { "TimeSensor":
            {
              "@DEF":"Clock10Seconds",
              "@cycleInterval":5,
              "@loop":true
            }
          },
          { "TimeSensor":
            {
              "@DEF":"Clock100Seconds",
              "@cycleInterval":100,
              "@enabled":false
            }
          },
          { "BooleanSequencer":
            {
              "@DEF":"Background3Sequencer",
              "@key":[0,0.09,0.11,0.22,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[true,true,true,false,false,false,false,false,false,false,false]
            }
          },
          { "BooleanSequencer":
            {
              "@DEF":"Background4Sequencer",
              "@key":[0,0.09,0.11,0.22,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[false,false,false,true,true,false,false,false,false,false,false]
            }
          },
          { "BooleanSequencer":
            {
              "@DEF":"Background5Sequencer",
              "@key":[0,0.09,0.11,0.22,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[false,false,false,false,false,true,true,true,false,false,false]
            }
          },
          { "BooleanSequencer":
            {
              "@DEF":"Background6Sequencer",
              "@key":[0,0.09,0.11,0.22,0.043,0.55,0.63,0.73,0.85,0.86,1],
              "@keyValue":[false,false,false,false,false,false,false,false,true,true,true]
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Background3Sequencer",
              "@toField":"set_bind",
              "@toNode":"Background3Black"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Background4Sequencer",
              "@toField":"set_bind",
              "@toNode":"Background4SkyBlueGreenGrass"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Background5Sequencer",
              "@toField":"set_bind",
              "@toNode":"Background5LightGrey"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Background6Sequencer",
              "@toField":"set_bind",
              "@toNode":"Background6DarkGrey"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background3Sequencer"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background4Sequencer"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background5Sequencer"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background6Sequencer"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background3Sequencer"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background4Sequencer"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background5Sequencer"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Background6Sequencer"
            }
          },
          {
            "#comment":"now move things around by modifying interpolator valuess"
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Gramps_HumanoidRoot_TranslationInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Leif_HumanoidRoot_TranslationInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Lily_HumanoidRoot_TranslationInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock10Seconds",
              "@toField":"set_fraction",
              "@toNode":"Tufani_HumanoidRoot_TranslationInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Gramps_HumanoidRoot_TranslationInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Leif_HumanoidRoot_TranslationInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Lily_HumanoidRoot_TranslationInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock100Seconds",
              "@toField":"set_fraction",
              "@toNode":"Tufani_HumanoidRoot_TranslationInterpolator"
            }
          },
          {
            "#comment":"now move things around by changing the Transform translation values"
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Gramps_HumanoidRoot_TranslationInterpolator",
              "@toField":"translation",
              "@toNode":"TextRoot"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Leif_HumanoidRoot_TranslationInterpolator",
              "@toField":"translation",
              "@toNode":"Root4"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Lily_HumanoidRoot_TranslationInterpolator",
              "@toField":"translation",
              "@toNode":"Root5"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"Tufani_HumanoidRoot_TranslationInterpolator",
              "@toField":"translation",
              "@toNode":"Root6"
            }
          }
        ]
    }
  }
}