315 lines
9.7 KiB
Text
315 lines
9.7 KiB
Text
The Open Scene Graph library, which current FlightGear uses for its 3D
|
|
graphics, provides excellent support for multiple views of a
|
|
scene. FlightGear uses the osgViewer::Viewer class, which implements a
|
|
"master" camera with "slave" cameras that are offset from the master's
|
|
position and orientation. FlightGear provides the "camera group"
|
|
abstraction which allows the configuration of slave cameras via the
|
|
property tree.
|
|
|
|
Slave cameras can be mapped to windows that are open on different
|
|
screens, or all in one window, or a combination of those two schemes,
|
|
according to the video hardware capabilities of a machine. It is not
|
|
advisable to open more than one window on a single graphics card due
|
|
to the added cost of OpenGL context switching between the
|
|
windows. Usually, multiple monitors attached to a single graphics card
|
|
are mapped to different pieces of the same desktop, so a window can be
|
|
opened that spans all the monitors. This is implemented by Nvidia's
|
|
TwinView technology and the Matrox TripleHead2Go hardware.
|
|
|
|
The camera group is configured by the /sim/rendering/camera-group node
|
|
in the property tree. It can be set up by, among other things, XML in
|
|
preferences.xml or in an XML file specified on the command line with
|
|
the --config option.
|
|
|
|
Here are the XML tags for defining camera groups.
|
|
|
|
camera-group
|
|
For the moment there can be only one camera group. It can contain
|
|
window, camera, or gui tags.
|
|
|
|
window
|
|
A window defines a graphics window. It can be at the camera-group
|
|
level or defined within a camera. The window contains these tags:
|
|
|
|
name - string
|
|
The name of the window which might be displayed in the window's
|
|
title bar. It is also used to refer to a previously defined
|
|
window. A window can contain just a name node, in which case
|
|
the whole window definition refers to a previously defined window.
|
|
|
|
host-name - string
|
|
The name of the host on which the window is opened. Usually this is
|
|
empty.
|
|
|
|
display - int
|
|
The display number on which the window is opened.
|
|
|
|
screen - int
|
|
The screen number on which the window is opened.
|
|
|
|
x, y - int
|
|
The location on the screen at which the window is opened. This is in
|
|
the window system coordinates, which usually puts 0,0 at the upper
|
|
left of the screen XXX check this for Windows.
|
|
|
|
width, height - int
|
|
The dimensions of the window.
|
|
|
|
decoration - bool
|
|
Whether the window manager should decorate the window.
|
|
|
|
fullscreen - bool
|
|
Shorthand for a window that occupies the entire screen with no
|
|
decoration.
|
|
|
|
camera
|
|
The camera node contains viewing parameters.
|
|
|
|
window
|
|
This specifies the window which displays the camera. Either it
|
|
contains just a name that refers to a previous window definition, or
|
|
it is a full window definition.
|
|
|
|
viewport
|
|
The viewport positions a camera within a window. It is most useful
|
|
when several cameras share a window.
|
|
|
|
x, y - int
|
|
The position of the lower left corner of the viewport, in y-up
|
|
coordinates.
|
|
|
|
width, height - int
|
|
The dimensions of the viewport
|
|
|
|
view
|
|
The view node specifies the origin and direction of the camera in
|
|
relation to the whole camera group. The coordinate system is +y up,
|
|
-z forward in the direction of the camera group view. This is the
|
|
same as the OpenGL viewing coordinates.
|
|
|
|
x,y,z - double
|
|
Coordinates of the view origin.
|
|
|
|
heading-deg, pitch-deg, roll-deg - double
|
|
Orientation of the view in degrees. These are specified using the
|
|
right-hand rule, so a positive heading turns the view to the left,
|
|
a positive roll rolls the view to the left.
|
|
|
|
perspective
|
|
This node is one way of specifying the viewing volume camera
|
|
parameters. It corresponds to the OpenGL gluPerspective function.
|
|
|
|
fovy-deg - double
|
|
The vertical field-of-view
|
|
|
|
aspect-ratio - double
|
|
Aspect ratio of camera rectangle (not the ratio between the
|
|
vertical and horizontal fields of view).
|
|
|
|
near, far - double
|
|
The near and far planes, in meters from the camera eye point. Note
|
|
that FlightGear assumes that the far plane is far away, currently
|
|
120km. The far plane specified here will be respected, but the sky
|
|
and other background elements may not be drawn if the view plane is
|
|
closer than 120km.
|
|
|
|
offset-x, offset-y - double
|
|
Offsets of the viewing volume specified by the other parameters in
|
|
the near plane, in meters.
|
|
|
|
frustum
|
|
This specifies the perspective viewing volume using values for the near
|
|
and far planes and coordinates of the viewing rectangle in the near
|
|
plane.
|
|
|
|
left, bottom - double
|
|
right, top - double
|
|
The coordinates of the viewing rectangle.
|
|
|
|
near, far - double
|
|
The near and far planes, in meters from the camera eye point.
|
|
|
|
ortho
|
|
This specifies an orthographic view. The parameters are the sames as
|
|
the frustum node's.
|
|
|
|
gui
|
|
This is a special camera node that displays the 2D GUI.
|
|
|
|
viewport
|
|
This specifies the position and dimensions of the GUI within a
|
|
window, *however* at the moment the origin must be at 0,0.
|
|
|
|
Here's an example that uses a single window mapped across 3
|
|
displays. The displays are in a video wall configuration in a
|
|
horizontal row.
|
|
|
|
<PropertyList>
|
|
<sim>
|
|
<rendering>
|
|
<camera-group>
|
|
<window>
|
|
<name>wide</name>
|
|
<host-name type="string"></host-name>
|
|
<display>0</display>
|
|
<screen>0</screen>
|
|
<width>3840</width>
|
|
<height>1024</height>
|
|
<decoration type = "bool">false</decoration>
|
|
</window>
|
|
<camera>
|
|
<window>
|
|
<name>wide</name>
|
|
</window>
|
|
<viewport>
|
|
<x>0</x>
|
|
<y>0</y>
|
|
<width>1280</width>
|
|
<height>1024</height>
|
|
</viewport>
|
|
<view>
|
|
<heading-deg type = "double">0</heading-deg>
|
|
</view>
|
|
<frustum>
|
|
<top>0.133</top>
|
|
<bottom>-0.133</bottom>
|
|
<left>-.5004</left>
|
|
<right>-.1668</right>
|
|
<near>0.4</near>
|
|
<far>120000.0</far>
|
|
</frustum>
|
|
</camera>
|
|
<camera>
|
|
<window>
|
|
<name type="string">wide</name>
|
|
</window>
|
|
<viewport>
|
|
<x>1280</x>
|
|
<y>0</y>
|
|
<width>1280</width>
|
|
<height>1024</height>
|
|
</viewport>
|
|
<view>
|
|
<heading-deg type = "double">0</heading-deg>
|
|
</view>
|
|
<frustum>
|
|
<top>0.133</top>
|
|
<bottom>-0.133</bottom>
|
|
<left>-.1668</left>
|
|
<right>.1668</right>
|
|
<near>0.4</near>
|
|
<far>120000.0</far>
|
|
</frustum>
|
|
</camera>
|
|
<camera>
|
|
<window>
|
|
<name>wide</name>
|
|
</window>
|
|
<viewport>
|
|
<x>2560</x>
|
|
<y>0</y>
|
|
<width>1280</width>
|
|
<height>1024</height>
|
|
</viewport>
|
|
<view>
|
|
<heading-deg type = "double">0</heading-deg>
|
|
</view>
|
|
<frustum>
|
|
<top>0.133</top>
|
|
<bottom>-0.133</bottom>
|
|
<left>.1668</left>
|
|
<right>.5004</right>
|
|
<near>0.4</near>
|
|
<far>120000.0</far>
|
|
</frustum>
|
|
</camera>
|
|
<gui>
|
|
<window>
|
|
<name type="string">wide</name>
|
|
</window>
|
|
</gui>
|
|
</camera-group>
|
|
</rendering>
|
|
</sim>
|
|
</PropertyList>
|
|
|
|
Here's a complete example that uses a seperate window on each
|
|
display. The displays are arranged in a shallow arc with the left and
|
|
right displays at a 45.3 degree angle to the center display because,
|
|
at the assumed screen dimensions, the horizontal field of view of one
|
|
display is 45.3 degrees. Each camera has its own window definition;
|
|
the center window is given the name "main" so that the GUI definition
|
|
can refer to it. Note that the borders of the displays are not
|
|
accounted for.
|
|
|
|
<PropertyList>
|
|
<sim>
|
|
<rendering>
|
|
<camera-group>
|
|
<camera>
|
|
<window>
|
|
<host-name type="string"></host-name>
|
|
<display>0</display>
|
|
<screen>0</screen>
|
|
<fullscreen type = "bool">true</fullscreen>
|
|
</window>
|
|
<view>
|
|
<heading-deg type = "double">45.3</heading-deg>
|
|
</view>
|
|
<frustum>
|
|
<top>0.133</top>
|
|
<bottom>-0.133</bottom>
|
|
<left>-.1668</left>
|
|
<right>.1668</right>
|
|
<near>0.4</near>
|
|
<far>120000.0</far>
|
|
</frustum>
|
|
</camera>
|
|
<camera>
|
|
<window>
|
|
<name type="string">main</name>
|
|
<host-name type="string"></host-name>
|
|
<display>0</display>
|
|
<screen>1</screen>
|
|
<fullscreen type = "bool">true</fullscreen>
|
|
</window>
|
|
<view>
|
|
<heading-deg type = "double">0</heading-deg>
|
|
</view>
|
|
<frustum>
|
|
<top>0.133</top>
|
|
<bottom>-0.133</bottom>
|
|
<left>-.1668</left>
|
|
<right>.1668</right>
|
|
<near>0.4</near>
|
|
<far>120000.0</far>
|
|
</frustum>
|
|
</camera>
|
|
<camera>
|
|
<window>
|
|
<host-name type="string"></host-name>
|
|
<display>0</display>
|
|
<screen>2</screen>
|
|
<fullscreen type = "bool">true</fullscreen>
|
|
</window>
|
|
<view>
|
|
<heading-deg type = "double">-45.3</heading-deg>
|
|
</view>
|
|
<frustum>
|
|
<top>0.133</top>
|
|
<bottom>-0.133</bottom>
|
|
<left>-.1668</left>
|
|
<right>.1668</right>
|
|
<near>0.4</near>
|
|
<far>120000.0</far>
|
|
</frustum>
|
|
</camera>
|
|
<gui>
|
|
<window>
|
|
<name type="string">main</name>
|
|
</window>
|
|
</gui>
|
|
</camera-group>
|
|
</rendering>
|
|
</sim>
|
|
</PropertyList>
|