The term frame is derived from an object's physical frame of reference. The frame's role in Retained Mode is similar to a window's role in a windowing system. Objects can be placed in a scene by stating their spatial relationship to a relevant reference frame; they are not simply placed in world space. A frame is used to position objects in a scene, and visuals take their positions and orientation from frames.
A scene in Retained Mode is defined by a frame that has no parent frame; that is, a frame at the top of the hierarchy of frames. This frame is also sometimes called a root frame or master frame. The scene defines the frame of reference for all of the other objects. You can create a scene by calling the IDirect3DRM3::CreateFrame method and specifying NULL for the first parameter.
The IDirect3DRMFrame3 interface is an extension of the IDirect3DRMFrame2 interface. IDirect3DRMFrame2 has methods that enable using materials, bounding boxes, and axes with frames. IDirect3DRMFrame2 also supports ray picking.
By using the IDirect3DRMFrame3::SetAxes method and using the right-handed projection types in the D3DRMPROJECTIONTYPE structure with the IDirect3DRMViewport2::SetProjection method, you can enable right-handed projection.
For related information, see IDirect3DRMFrame3.
This section describes frames and how your application can use them.
The frames in a scene are arranged in a tree structure. Frames can have a parent frame and child frames. Remember, a frame that has no parent frame defines a scene and is called a root frame.
Child frames have positions and orientations relative to their parent frames. If the parent frame moves, the child frames also move.
An application can set the position and orientation of a frame relative to any other frame in the scene, including the root frame if it needs to set an absolute position. You can also remove frames from one parent frame and add them to another at any time by using the IDirect3DRMFrame3::AddChild method. To remove a child frame entirely, use the IDirect3DRMFrame3::DeleteChild method. To retrieve a frame's child and parent frames, use the IDirect3DRMFrame3::GetChildren and IDirect3DRMFrame3::GetParent methods.
You can add frames as visuals to other frames, allowing you to use a given hierarchy many times throughout a scene. The new hierarchies are referred to as instances. Be careful to avoid instancing a parent frame into its children because that will degrade performance. Retained Mode does no run-time checking for cyclic hierarchies. You cannot create a cyclic hierarchy by using the methods of the IDirect3DRMFrame3 interface; instead, this is possible only when you add a frame as a visual.
You can think of the position and orientation of a frame relative to its parent frame as a linear transformation. This transformation takes vectors defined relative to the child frame and changes them to equivalent vectors defined relative to the parent.
Transformations can be represented by 4×4 matrices, and coordinates can be represented by four-element row vectors, [x, y, z,1].
If vchild is a coordinate in the child frame, then vparent, the equivalent coordinate in the parent frame, is defined as:
Tchild is the child frame's transformation matrix.
The transformations of all the parent frames above a child frame up to the root frame are concatenated with the transformation of that child to produce a world transformation. This world transformation is then applied to the visuals on the child frame before rendering. Coordinates relative to the child frame are sometimes called model coordinates. After the world transformation is applied, coordinates are called world coordinates.
The transformation of a frame can be modified directly by using the IDirect3DRMFrame3::AddTransform, IDirect3DRMFrame3::AddScale, IDirect3DRMFrame3::AddRotation, and IDirect3DRMFrame3::AddTranslation methods. Each of these methods specifies a member of the D3DRMCOMBINETYPE enumerated type, which specifies how the matrix supplied by the application should be combined with the current frame's matrix.
The IDirect3DRMFrame3::GetRotation and IDirect3DRMFrame3::GetTransform methods allow you to retrieve a frame's rotation axis and transformation matrix. To change the rotation of a frame, use the IDirect3DRMFrame3::SetRotation method.
Use the IDirect3DRMFrame3::Transform and IDirect3DRMFrame3::InverseTransform methods to change between world coordinates and model coordinates.
You can find a more general discussion of transformations in the Transformations section devoted to viewports. For an overview of the mathematics of transformations, see 3-D Transformations.
Every frame has an intrinsic rotation and velocity. Frames that are neither rotating nor translating simply have zero values for these attributes. These attributes are used before each scene is rendered to move objects in the scene, and they can also be used to create simple animations.
Frames support a callback function that you can use to support more complex animations. The application registers a function that the frame calls before the motion attributes are applied. When there are multiple frames in a hierarchy, each with associated callback functions, the parent frames are called before the child frames. For a given hierarchy, rendering does not take place until all of the required callback functions have been invoked.
To add this callback function, use the IDirect3DRMFrame3::AddMoveCallback method; to remove it, use the IDirect3DRMFrame3::DeleteMoveCallback method.
You can use these callback functions to provide new positions and orientations from a preprogrammed animation sequence or to implement dynamic motion in which the activities of visuals depend upon the positions of other objects in the scene.
Top of Page
© 2000 Microsoft and/or its suppliers. All rights reserved. Terms of Use.