Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "GEF3D Coordinate Systems"

Line 14: Line 14:
 
origin seems to be in the upper left / front corner
 
origin seems to be in the upper left / front corner
 
==== Figure-local 3D Coordinates ====
 
==== Figure-local 3D Coordinates ====
=== Virtual Coordinates ===
+
=== Surface 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 and the virtual coordinates are integers which may be negative.
+
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'' surface 2D coordinates. This surface coordinate system has its origin in the upper left corner of the drawing surface and the surface coordinates are integers which may be negative.
  
 
== Coordinate Conversion ==
 
== Coordinate Conversion ==
  
=== Virtual Coordinates to 3D world Coordinates ===
+
=== Surface 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:
+
To convert surface 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 surface coordinates. The IFigure2DHost3D interface contains two methods that allow conversion of surface to world coordinates using the implementing figure as the reference:
  
 
<source lang="java">
 
<source lang="java">
 
/**
 
/**
* Converts the given virtual 2D coordinates to 3D world coordinates.
+
* Converts the given 3D world coordinates to 2D surface coordinates. The
*  
+
* surface point is specified by the intersection of a line that is
* @param i_vX
+
* perpendicular to the figure's surface and that contains the given point.
*            the virtual X coordinate
+
*
* @param i_vY
+
* @param i_wX
*            the virtual Y coordinate
+
*            the world X coordinate
* @param io_result
+
* @param i_wY
*            the result vector, if <code>null</code>, a new vector will be
+
*            the world Y coordinate
*            created
+
* @param i_wZ
*
+
*            the world Z coordinate
* @return the 3D world coordinates of the given virtual coordinates
+
* @param io_result
*/
+
*            the result point, if <code>null</code>, a new point will be
public IVector3f getLocation3D(int i_vX, int i_vY, Vector3f io_result);
+
*            created
 +
* @return the 2D surface coordinates of the given 3D point
 +
*/
 +
public Point getLocation2D(float i_wX, float i_wY, float i_wZ, Point io_result);
  
/**
+
/**
* Converts the given virtual 2D coordinates to 3D world coordinates.
+
* Converts the given 3D world coordinates to 2D surface coordinates. The
*  
+
* surface point is specified by the intersection of a line that is
* @param i_vCoords
+
* perpendicular to the figure's surface and that contains the given point.
*            the virtual coordinates
+
*
* @param io_result
+
* @param i_wCoords
*            the result vector, if <code>null</code>, a new vector will be
+
*            the 3D world coordinates
*            created
+
* @param io_result
*
+
*            the result point, if <code>null</code>, a new point will be
* @return the 3D world coordinates of the given point
+
*            created
*/
+
* @return the 2D surface coordinates of the given 3D point
public IVector3f getLocation3D(Point i_vCoords, Vector3f io_result);
+
*/
 +
public Point getLocation2D(IVector3f i_wCoords, Point io_result);
 
</source>
 
</source>
  
The first method is a convenience method which takes a point with virtual coordinates and the second method takes two integer coordinates.
+
The first method is a convenience method which takes a point with surface coordinates and the second method takes two integer coordinates.
  
=== 3D World Coordinates to Virtual Coordinates ===
+
=== 3D World Coordinates to Surface Coordinates ===
The same as above applies to the opposite direction: A host figure is needed as a reference, so IFigure2DHost3D contains two methods to convert 3D world coordinates to virtual coordinates
+
The same as above applies to the opposite direction: A host figure is needed as a reference, so IFigure2DHost3D contains two methods to convert 3D world coordinates to surface coordinates
  
 
<source lang="Java">
 
<source lang="Java">
/**
+
/**
* Converts the given 3D world coordinates to 2D virtual coordinates. The
+
* Converts the given surface 2D coordinates to 3D world coordinates.
* virtual point is specified by the intersection of a line that is
+
*  
* perpendicular to the figure's surface and that contains the given point.
+
* @param i_sX
*
+
*            the surface X coordinate
* @param i_wX
+
* @param i_sY
*            the world X coordinate
+
*            the surface Y coordinate
* @param i_wY
+
* @param io_result
*            the world Y coordinate
+
*            the result vector, if <code>null</code>, a new vector will be
* @param i_wZ
+
*            created
*            the world Z coordinate
+
*
* @param io_result
+
* @return the 3D world coordinates of the given surface coordinates
*            the result point, if <code>null</code>, a new point will be
+
*/
*            created
+
public IVector3f getLocation3D(int i_sX, int i_sY, Vector3f io_result);
* @return the 2D virtual coordinates of the given 3D point
+
*/
+
public Point getLocation2D(float i_wX, float i_wY, float i_wZ, Point io_result);
+
  
/**
+
/**
* Converts the given 3D world coordinates to 2D virtual coordinates. The
+
* Converts the given surface 2D coordinates to 3D world coordinates.
* virtual point is specified by the intersection of a line that is
+
*  
* perpendicular to the figure's surface and that contains the given point.
+
* @param i_sCoords
*
+
*            the surface coordinates
* @param i_wCoords
+
* @param io_result
*            the 3D world coordinates
+
*            the result vector, if <code>null</code>, a new vector will be
* @param io_result
+
*            created
*            the result point, if <code>null</code>, a new point will be
+
*
*            created
+
* @return the 3D world coordinates of the given surface point
* @return the 2D virtual coordinates of the given 3D point
+
*/
*/
+
public IVector3f getLocation3D(Point i_sCoords, Vector3f io_result);
public Point getLocation2D(IVector3f i_wCoords, Point io_result);
+
 
</source>
 
</source>
  
Note that the 3D coordinates to not have to be on the host figure's drawing surface. The given 3D point is projected onto the surface before the virtual coordinates are calculated.
+
Note that the 3D coordinates to not have to be on the host figure's drawing surface. The given 3D point is projected onto the surface before the surface coordinates are calculated.
  
 
* global world coordinates <-> figure-local 3D coordinates
 
* global world coordinates <-> figure-local 3D coordinates

Revision as of 12:37, 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.

Mouse coordinate system

The origin of the mouse coordinate system is in the top left corner of the viewport, so mouse coordinates are always positive integers. 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

Surface 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 surface 2D coordinates. This surface coordinate system has its origin in the upper left corner of the drawing surface and the surface coordinates are integers which may be negative.

Coordinate Conversion

Surface Coordinates to 3D world Coordinates

To convert surface 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 surface coordinates. The IFigure2DHost3D interface contains two methods that allow conversion of surface to world coordinates using the implementing figure as the reference:

/**
	 * Converts the given 3D world coordinates to 2D surface coordinates. The
	 * surface point is specified by the intersection of a line that is
	 * perpendicular to the figure's surface and that contains the given point.
	 * 
	 * @param i_wX
	 *            the world X coordinate
	 * @param i_wY
	 *            the world Y coordinate
	 * @param i_wZ
	 *            the world Z coordinate
	 * @param io_result
	 *            the result point, if <code>null</code>, a new point will be
	 *            created
	 * @return the 2D surface coordinates of the given 3D point
	 */
	public Point getLocation2D(float i_wX, float i_wY, float i_wZ, Point io_result);
 
	/**
	 * Converts the given 3D world coordinates to 2D surface coordinates. The
	 * surface point is specified by the intersection of a line that is
	 * perpendicular to the figure's surface and that contains the given point.
	 * 
	 * @param i_wCoords
	 *            the 3D world coordinates
	 * @param io_result
	 *            the result point, if <code>null</code>, a new point will be
	 *            created
	 * @return the 2D surface coordinates of the given 3D point
	 */
	public Point getLocation2D(IVector3f i_wCoords, Point io_result);

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

3D World Coordinates to Surface Coordinates

The same as above applies to the opposite direction: A host figure is needed as a reference, so IFigure2DHost3D contains two methods to convert 3D world coordinates to surface coordinates

	/**
	 * Converts the given surface 2D coordinates to 3D world coordinates.
	 * 
	 * @param i_sX
	 *            the surface X coordinate
	 * @param i_sY
	 *            the surface Y coordinate
	 * @param io_result
	 *            the result vector, if <code>null</code>, a new vector will be
	 *            created
	 * 
	 * @return the 3D world coordinates of the given surface coordinates
	 */
	public IVector3f getLocation3D(int i_sX, int i_sY, Vector3f io_result);
 
	/**
	 * Converts the given surface 2D coordinates to 3D world coordinates.
	 * 
	 * @param i_sCoords
	 *            the surface coordinates
	 * @param io_result
	 *            the result vector, if <code>null</code>, a new vector will be
	 *            created
	 * 
	 * @return the 3D world coordinates of the given surface point
	 */
	public IVector3f getLocation3D(Point i_sCoords, Vector3f io_result);

Note that the 3D coordinates to not have to be on the host figure's drawing surface. The given 3D point is projected onto the surface before the surface coordinates are calculated.

  • 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

Copyright © Eclipse Foundation, Inc. All Rights Reserved.