Status: Draft William Denniss Version: 1 Tank Software Revision: 05 March 2004 XML ODE Data Interchange Format - XODE Status of this Memo This document specifies a proposed standard for the ODE community. Distribution of this memo is unlimited. Abstract This document describes an XML format which can be used as a common ODE interchange format. 1 Introduction 1.1 About ODE Open Dynamics Engine (ODE) is a "free, industrial quality library for simulating articulated rigid body dynamics - for example ground vehicles, legged creatures, and moving objects in VR environments. It is fast, flexible, robust and platform independent, with advanced joints, contact with friction, and built-in collision detection". A typical ODE scene hierarchy consists of physics, collision and display objects. Physics and collision is typically handled by ODE with the graphics potentially using any number of display libraries (three dimensional or otherwise). This scene structure is commonly used in both graphical ODE editing applications, and software using ODE. 1.2 Purpose The goal of this standard is to provide a method of storing an ODE scene, representing the physics, collision objects and to do so in a generic, interoperable and extensible manner. It is not a generic physics scene notation, but rather is ODE specific so as to fully represent an ODE scene without compromise or addition. Like ODE, there is no binding to a particular display library, although it is possible to store display-specific (and any other) information though the use of extensions. 1.3 Requirements The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119. An implementation is not compliant if it fails to satisfy one or more of the MUST or REQUIRED level requirements for the protocols it implements. An implementation that satisfies all the MUST or REQUIRED level and all the SHOULD level requirements for its protocols is said to be "unconditionally compliant"; one that satisfies all the MUST level requirements but not all the SHOULD level requirements for its protocols is said to be "conditionally compliant." 1.4 Terminology importer Code which can read the XODE format into some internal representation for manipulation, display or otherwise. exporter Code that can write an XODE formatted file from some internal representation. collision system A mathematical engine which detects when two objects intersect and generates an appropriate response physics engine A mathematical engine that has set of physical rules for example gravity or friction that it applies to objects in it's system graphical engine A programming library used to display objects to the user, for example a 3D OpenGL scenegraph. world A container for physics body objects body A physics object with such properties as mass space A container for collision objects collision geom A geometry describing a shape that is used for collision group A collection of objects organised into a bag for organisational reasons. joint A relationship between two bodies that connects them together in some way. 2 XML Tags 2.1 ODE Objects ODE objects are entities which have a direct meaning in ODE. These are: All ODE objects may contain a attribute which. If this attribute is not present, the transform of the objects parent is used. 2.1.1 Representation for the ODE body object (used in the physics engine). It has the following attributes (with examples): 1 false 1 2.1.2 Representation for geometry objects (used in the collision detection engine). It is usually attached to a body (as a child node) but this doesn't have to be the case if representing a static - immovable object (such as a wall). Geometry objects must define a 'shape' attribute which can have one of several values. Listed below are those values with the list of expected attributes for each shape. In each case, the data type for the value is a float with the exception of 'trimesh' which is further detailed following this list: "box" sizex, sizey, sizez "cappedcylinder" radius, length "cone" radius, length "cylinder" radius, length "plane" a, b, c, d "ray" length "sphere" radius "trimesh" vertices, indices Examples: Geom Box: ... Geom Cylinder: ... The 'trimesh' shape is unique as a 3D mesh must be defined. The mesh is an indexed triangle array. Example: 1 2 4 3 2.1.3 Represents a joint in ODE. Joint objects must define a 'type' attribute which can have one of several values and determines the underlying ODE joint which is used. Listed below are those values. "amotor" "ball" "fixed" "hinge" "hinge2" "slider" "universal" Joints link two bodies together. The first body is assumed to be the parent of the joint unless specified with the "link1" tag. Eg. The second body is specified by the "link2" tag, eg: Some joints have one or more axes which is defined like so: 0 0 0 0 0 0 0 0.05 0.0001 0.05 0.0001 The number of axes per joint type is fixed at the following numbers: amotor 3 ball 0 fixed 0 hinge 1 hinge2 2 slider 1 universal 2 A joint MUST have the exact number of required axes. 2.2 Containers Containers are groups of ODE objects. Some of the containers have a representation within ODE itself, but not all. The containers are: Each container can store the following objects: In addition, there are two special containers with different goals: is a special form of container which can only store objects. is a special form of container which can only store containers All containers (including ) can have the transform attribute. If they do not, then the transform object of that containers parent is used (in the case of , this is the origin). This transform is relative to its parent transform. The attribute is further defined below. 2.2.1 In addition to its properties as a container, the tag has special significance as it represents an ODE world. Implementations MUST support this container. 2.2.2 Unlike the other containers, group has no actual meaning in ODE. This is also part of its usefulness as it can be used to structure data in a way which does not directly affect the ODE representation. Importers MUST be able to read the group container and it's contents and it is RECOMMENDED that exporters preserve and export the group structure. 2.3 Transform Attribute Transforms can be defined in one of two ways, although the same method must be used throughout a given . They are always considered to be relative to their parent unless otherwise specified by setting the "absolute" attribute to 'true'. Matrix Transform Style: A 4x4 matrix. The rows are enclosed by square brackets and their elements within by commas. [0,1,2,0] [1,0,1,3] [0,1,0,1] [2,0,2,0] Vector Transform Style: Three vectors representing the position, rotation, and scale. By default, the Matrix transform style is assumed. To manually specify either transform style, the "transformstyle" attribute of must be specified. It's value is either 'matrix' for the Matrix Transform Style, or 'vector' for the Vector Transform Style Importers MUST be able to read both styles, and SHOULD be able to export either style. 2.4 Extension Mechanism For extensibility reasons - all XODE tags without exception may additionally contain an "" tag. This tag is provided so that extensions can be added to the format by applications. This tag MUST contain a name attribute so importers can recognise the extension. Any time an XODE file is imported with the intention of being altered and exported, the importer SHOULD read this tag and save it's data for exporting even if they are not using any extensions themselves. This is so that an XODE file with such extension data can be edited in an editor which doesn't support it's extensions without losing said data. Applications using the tag of XODE SHOULD attempt to do so in a way that multiple extensions can co-exist in a file. The recommended way of doing this is using giving each extension a unique name. Eg: ... ... In the above example, and application not supporting the extension "foo" should still preserve its data when exporting. 3 Example File This is an example XODE file. 5 ./data/models/tire-small.3ds 5 10 0 0 0 0 1 0 0 0.05 0.0001 0.05 0.0001 0 0 0 0 1 0 0 0.05 0.0001 0.05 0.0001 0 0 0 0 1 0 0 0.05 0.0001 0.05 0.0001 0 0 0 0 1 0 0 0.05 0.0001 0.05 0.0001 [1.0, 0.0, 1.0, 1.0] [1.4, 2.2, 1.0, 1.0] [1.6, 0.1, 1.3, 5.2] [1.3, 4.3, 1.1, 1.2]