# Difference between revisions of "GEF3D Coordinate Systems"

Line 15: | Line 15: | ||

==== Figure-local 3D Coordinates ==== | ==== Figure-local 3D Coordinates ==== | ||

=== Virtual Coordinates === | === Virtual Coordinates === | ||

− | 2D | + | When a GEF 2D editor is embedded in GEF3D, its root figure is added to a 3D host figure, usually a cuboid shape. The 2D figures are drawn on the front face of the cuboid, which we will call drawing surface. Since an embedded GEF editor cannot handle 3D coordinates, it must be supplied virtual 2D coordinates. This virtual coordinate system has its origin in the upper left corner of the drawing surface. |

== Coordinate Conversion == | == Coordinate Conversion == | ||

+ | |||

+ | === Virtual coordinates to 3D world coordinates === | ||

+ | To convert virtual coordinates to 3D world coordinates, a reference 3D figure is needed, which is usually the host figure of the embedded 2D editor that uses the virtual coordinates. The IFigure2DHost3D interface contains two methods that allow conversion of virtual to world coordinates using the implementing figure as the reference: | ||

+ | |||

+ | ''IFigure2DHost3D.getLocation3D(Point, Vector3f)'' and | ||

+ | ''IFigure2DHost3D.getLocation3D(int, int, Vector3f)''. | ||

+ | |||

+ | The first method is a convenience method which takes a point with virtual coordinates and the second method takes two integer coordinates. | ||

+ | |||

* global world coordinates <-> figure-local 3D coordinates | * global world coordinates <-> figure-local 3D coordinates | ||

* surface coordinates <-> global world coordinates | * surface coordinates <-> global world coordinates |

## Revision as of 10:34, 30 June 2009

In GEF, there usually is one global coordinate system and figure-local coordinate systems to deal with. Generally, mouse coordinates can be translate to the global coordinate system and the figure-local coordinate systems in a simple and straightforward fashion, and users of the framework seldomly have to deal with these issues. In GEF3D however, there are more coordinate systems involved and dealing with those can become cumbersome. This article aims to describe the concepts of coordinate systems and coordinate system conversion in GEF3D.

## Coordinate Systems

### Mouse Coordinates

Mouse coordinates are used to specify the location of the mouse cursor relative to a control. In the case of GEF3D, the control is the OpenGL canvas, in which the OpenGL viewport is rendered.

The origin of the mouse coordinate system is in the top left corner of the viewport, so mouse coordinates are always positive. In the picture, the current mouse coordinates are (147,105), and these are the same values that are contained in the mouse events that the GEF lightweight system receives and dispatches to figures and tools. In GEF3D however, these coordinates are handled a bit differently in order to allow seamless integration of embedded 2D editors (see below.

### World Coordinates

3D coordinates in world space

#### Inverted Coordinate System

origin seems to be in the upper left / front corner

#### Figure-local 3D Coordinates

### Virtual Coordinates

When a GEF 2D editor is embedded in GEF3D, its root figure is added to a 3D host figure, usually a cuboid shape. The 2D figures are drawn on the front face of the cuboid, which we will call drawing surface. Since an embedded GEF editor cannot handle 3D coordinates, it must be supplied virtual 2D coordinates. This virtual coordinate system has its origin in the upper left corner of the drawing surface.

## Coordinate Conversion

### Virtual coordinates to 3D world coordinates

To convert virtual coordinates to 3D world coordinates, a reference 3D figure is needed, which is usually the host figure of the embedded 2D editor that uses the virtual coordinates. The IFigure2DHost3D interface contains two methods that allow conversion of virtual to world coordinates using the implementing figure as the reference:

*IFigure2DHost3D.getLocation3D(Point, Vector3f)* and
*IFigure2DHost3D.getLocation3D(int, int, Vector3f)*.

The first method is a convenience method which takes a point with virtual coordinates and the second method takes two integer coordinates.

- global world coordinates <-> figure-local 3D coordinates
- surface coordinates <-> global world coordinates
- screen coordinates + depth value -> global world coordinates
- screen coordinates -> figure-local 3D coordinates
- screen coordinates -> surface coordinates

## Embedded 2D GEF Editors

### Make Yourself at Home: Creating a Fake 2D Environment

Coordinate conversion, Virtual picking, modified SWT events