{ "X3D": {
    "encoding":"UTF-8",
    "@profile":"Interchange",
    "@version":"3.3",
    "@xsd:noNamespaceSchemaLocation":"https://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":"NormalInterpolatorExample.x3d"
          },
          {
            "@name":"description",
            "@content":"Example normal (perpendicular vector) animation, where orange vectors show normal direction at each polygon vertex."
          },
          {
            "@name":"creator",
            "@content":"Don Brutzman"
          },
          {
            "@name":"created",
            "@content":"3 May 2008"
          },
          {
            "@name":"modified",
            "@content":"25 August 2023"
          },
          {
            "@name":"reference",
            "@content":"https://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Chapter19-NormalsShading/Figure19.27SquareFaceAnimatingNormals.x3d"
          },
          {
            "@name":"subject",
            "@content":"X3D NormalInterpolator example"
          },
          {
            "@name":"identifier",
            "@content":"https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter07EventAnimationInterpolation/NormalInterpolatorExample.x3d"
          },
          {
            "@name":"generator",
            "@content":"X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit"
          },
          {
            "@name":"license",
            "@content":"../license.html"
          },
          {
            "@name":"translated",
            "@content":"17 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":"NormalInterpolatorExample.x3d"
            }
          },
          { "Viewpoint":
            {
              "@description":"Animating normals on right vertices of a quadrilateral",
              "@position":[0,0,8]
            }
          },
          { "Viewpoint":
            {
              "@description":"Other side - note difference in animated shading",
              "@orientation":[0,1,0,3.14159],
              "@position":[0,0,-7]
            }
          },
          { "Shape":
            {
              "-geometry":
                { "IndexedFaceSet":
                  {
                    "@DEF":"FlatSquare",
                    "@coordIndex":[0,1,2,3],
                    "@normalIndex":[0,1,2,3],
                    "@solid":false,
                    "-coord":
                      { "Coordinate":
                        {
                          "@point":[-2,-2,0,2,-2,0,2,2,0,-2,2,0]
                        }
                      },
                    "-children":[
                      {
                        "#comment":"Normal vector with 4 SFVec3f triplet values, one for each corner of quadrilateral"
                      }
                    ],
                    "-normal":
                      { "Normal":
                        {
                          "@DEF":"AnimatedNormalNode",
                          "@vector":[0,0,1,0,0,1,0,0,1,0,0,1]
                        }
                      }
                  }
                },
              "-appearance":
                { "Appearance":
                  {
                    "-material":
                      { "Material":
                        {
                          "@DEF":"LightBlue",
                          "@diffuseColor":[0.3,0.6,0.9]
                        }
                      }
                  }
                }
            }
          },
          {
            "#comment":"NormalInterpolator keyValue array must match sizes of target Normal vector and key arrays"
          },
          {
            "#comment":"Thus this keyValue array has 4 * 3 = 12 total SFVec3f triplet values"
          },
          { "NormalInterpolator":
            {
              "@DEF":"NormalPath",
              "@key":[0,0.5,1],
              "@keyValue":[0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1]
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"NormalPath",
              "@toField":"set_vector",
              "@toNode":"AnimatedNormalNode"
            }
          },
          { "TimeSensor":
            {
              "@DEF":"Clock",
              "@cycleInterval":8,
              "@loop":true
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock",
              "@toField":"set_fraction",
              "@toNode":"NormalPath"
            }
          },
          {
            "#comment":"This block above completes the primary functionality of this scene. More to follow, however!"
          },
          {
            "#comment":"=============================================================================================================="
          },
          {
            "#comment":"Note that a Normal is not rendered - it is invisible. So this scene adds some lines to visualize what is happening."
          },
          { "Shape":
            {
              "-geometry":
                { "IndexedLineSet":
                  {
                    "@coordIndex":[0,1,-1,2,3,-1,4,5,-1,6,7,-1],
                    "-coord":
                      { "Coordinate":
                        {
                          "@DEF":"NormalVectors",
                          "@point":[-2,-2,0,-2,-2,1,2,-2,0,2,-2,1,2,2,0,2,2,1,-2,2,0,-2,2,1]
                        }
                      }
                  }
                },
              "-appearance":
                { "Appearance":
                  {
                    "-material":
                      { "Material":
                        {
                          "@emissiveColor":[0.9,0.6,0.1]
                        }
                      }
                  }
                }
            }
          },
          { "CoordinateInterpolator":
            {
              "@DEF":"NormalVectorsAnimation",
              "@key":[0,0.5,1],
              "@keyValue":[-2,-2,0,-2,-2,1,2,-2,0,2,-2,1,2,2,0,2,2,1,-2,2,0,-2,2,1,-2,-2,0,-2,-2,1,2,-2,0,3,-2,0,2,2,0,3,2,0,-2,2,0,-2,2,1,-2,-2,0,-2,-2,1,2,-2,0,2,-2,1,2,2,0,2,2,1,-2,2,0,-2,2,1]
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"NormalVectorsAnimation",
              "@toField":"point",
              "@toNode":"NormalVectors"
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"Clock",
              "@toField":"set_fraction",
              "@toNode":"NormalVectorsAnimation"
            }
          }
        ]
    }
  }
}