Open Game Engine Exchange

OpenGEX
Filename extension .ogex
Internet media type model/vnd.opengex
Developed by Eric Lengyel
Initial release 21 December 2013 (2013-12-21)
Latest release
1.1.2
(11 December 2014 (2014-12-11))
Type of format 3D computer graphics
Extended from OpenDDL
Open format? Yes
Website opengex.org

The Open Game Engine Exchange (OpenGEX) format is a text-based file format designed to facilitate the transfer of complex 3D scene data between applications such as modeling tools and game engines. The OpenGEX format is built upon the data structure concepts defined by the Open Data Description Language (OpenDDL), a generic language for the storage of arbitrary data in human-readable format. The OpenGEX file format is registered with the Internet Assigned Numbers Authority (IANA) as the model/vnd.opengex media type.[1]

The OpenGEX format is defined by the Open Game Engine Exchange Specification,[2] which is available on the official website opengex.org.

Export plugins that write the OpenGEX format are available for Autodesk Maya, 3D Studio Max, and Blender.

Format

At the most basic level, an OpenGEX file consists of a node hierarchy, a set of objects, a set of materials, and some additional information about global units and axis orientation. The various node, object, and material structures contain all of the details such as geometric data and animation tracks within a hierarchy of additional types of structures defined by OpenGEX. The following types of data can appear in an OpenGEX file:

Example

A very simple example of a complete OpenGEX file describing a green cube is shown in the listing below. It begins with a group of Metric structures that define the units of measurement and the global up direction. Those are followed by a single GeometryNode structure that provides the name and transform for the cube. The geometric data for the cube is stored in the GeometryObject structure that is referenced by the geometry node. The geometry object structure contains a single mesh of triangle primitives that includes per-vertex positions, normals, and texture coordinates. Finally, the Material structure at the end of the file contains the green diffuse reflection color.

Metric (key = "distance") {float {0.01}}
Metric (key = "angle") {float {1}}
Metric (key = "time") {float {1}}
Metric (key = "up") {string {"z"}}

GeometryNode $node1
{
    Name {string {"Cube"}}
    ObjectRef {ref {$geometry1}}
    MaterialRef {ref {$material1}}

    Transform
    {
        float[16]
        {
            {0x3F800000, 0x00000000, 0x00000000, 0x00000000,        // {1, 0, 0, 0
             0x00000000, 0x3F800000, 0x00000000, 0x00000000,        //  0, 1, 0, 0
             0x00000000, 0x00000000, 0x3F800000, 0x00000000,        //  0, 0, 1, 0
             0x42480000, 0x42480000, 0x00000000, 0x3F800000}        //  50, 50, 0, 1}
        }
    }
}

GeometryObject $geometry1        // Cube
{
    Mesh (primitive = "triangles")
    {
        VertexArray (attrib = "position")
        {
            float[3]        // 24
            {
                {0xC2480000, 0xC2480000, 0x00000000}, {0xC2480000, 0x42480000, 0x00000000},
                {0x42480000, 0x42480000, 0x00000000}, {0x42480000, 0xC2480000, 0x00000000},
                {0xC2480000, 0xC2480000, 0x42C80000}, {0x42480000, 0xC2480000, 0x42C80000},
                {0x42480000, 0x42480000, 0x42C80000}, {0xC2480000, 0x42480000, 0x42C80000},
                {0xC2480000, 0xC2480000, 0x00000000}, {0x42480000, 0xC2480000, 0x00000000},
                {0x42480000, 0xC2480000, 0x42C80000}, {0xC2480000, 0xC2480000, 0x42C80000},
                {0x42480000, 0xC2480000, 0x00000000}, {0x42480000, 0x42480000, 0x00000000},
                {0x42480000, 0x42480000, 0x42C80000}, {0x42480000, 0xC2480000, 0x42C80000},
                {0x42480000, 0x42480000, 0x00000000}, {0xC2480000, 0x42480000, 0x00000000},
                {0xC2480000, 0x42480000, 0x42C80000}, {0x42480000, 0x42480000, 0x42C80000},
                {0xC2480000, 0x42480000, 0x00000000}, {0xC2480000, 0xC2480000, 0x00000000},
                {0xC2480000, 0xC2480000, 0x42C80000}, {0xC2480000, 0x42480000, 0x42C80000}
            }
        }

        VertexArray (attrib = "normal")
        {
            float[3]        // 24
            {
                {0x00000000, 0x00000000, 0xBF800000}, {0x00000000, 0x00000000, 0xBF800000},
                {0x00000000, 0x00000000, 0xBF800000}, {0x00000000, 0x00000000, 0xBF800000},
                {0x00000000, 0x00000000, 0x3F800000}, {0x00000000, 0x00000000, 0x3F800000},
                {0x00000000, 0x00000000, 0x3F800000}, {0x00000000, 0x00000000, 0x3F800000},
                {0x00000000, 0xBF800000, 0x00000000}, {0x00000000, 0xBF800000, 0x00000000},
                {0x00000000, 0xBF800000, 0x00000000}, {0x80000000, 0xBF800000, 0x00000000},
                {0x3F800000, 0x00000000, 0x00000000}, {0x3F800000, 0x00000000, 0x00000000},
                {0x3F800000, 0x00000000, 0x00000000}, {0x3F800000, 0x00000000, 0x00000000},
                {0x00000000, 0x3F800000, 0x00000000}, {0x00000000, 0x3F800000, 0x00000000},
                {0x00000000, 0x3F800000, 0x00000000}, {0x80000000, 0x3F800000, 0x00000000},
                {0xBF800000, 0x00000000, 0x00000000}, {0xBF800000, 0x00000000, 0x00000000},
                {0xBF800000, 0x00000000, 0x00000000}, {0xBF800000, 0x00000000, 0x00000000}
            }
        }

        VertexArray (attrib = "texcoord")
        {
            float[2]        // 24
            {
                {0x3F800000, 0x00000000}, {0x3F800000, 0x3F800000}, {0x00000000, 0x3F800000},
                {0x00000000, 0x00000000}, {0x00000000, 0x00000000}, {0x3F800000, 0x00000000},
                {0x3F800000, 0x3F800000}, {0x00000000, 0x3F800000}, {0x00000000, 0x00000000},
                {0x3F800000, 0x00000000}, {0x3F800000, 0x3F800000}, {0x00000000, 0x3F800000},
                {0x00000000, 0x00000000}, {0x3F800000, 0x00000000}, {0x3F800000, 0x3F800000},
                {0x00000000, 0x3F800000}, {0x00000000, 0x00000000}, {0x3F800000, 0x00000000},
                {0x3F800000, 0x3F800000}, {0x00000000, 0x3F800000}, {0x00000000, 0x00000000},
                {0x3F800000, 0x00000000}, {0x3F800000, 0x3F800000}, {0x00000000, 0x3F800000}
            }
        }

        IndexArray
        {
            unsigned_int32[3]        // 12
            {
                {0, 1, 2}, {2, 3, 0}, {4, 5, 6}, {6, 7, 4}, {8, 9, 10},
                {10, 11, 8}, {12, 13, 14}, {14, 15, 12}, {16, 17, 18},
                {18, 19, 16}, {20, 21, 22}, {22, 23, 20}
            }
        }
    }
}

Material $material1
{
    Name {string {"Green"}}

    Color (attrib = "diffuse") {float[3] {{0, 1, 0}}}
}

History

The development of the OpenGEX format was funded by a crowd-sourcing campaign[3] that ended on May 8, 2013. As the format was being designed, the Open Data Description Language was also created as a generic base language upon which OpenGEX was built. Support for the OpenGEX format was originally implemented in C4 Engine version 3.5.

References

  1. "IANA Media Types, Model".
  2. Lengyel, Eric (2014). Open Game Engine Exchange Specification, Version 1.1.2. Terathon Software LLC. ISBN 978-0-9858117-3-0.
  3. "Open 3D Model Exchange Format and Exporters for Popular Software".
This article is issued from Wikipedia - version of the 6/4/2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.