[API Review] RT-28129: event coordinates with perspective camera
Chien Yang
chien.yang at oracle.com
Fri Feb 1 10:57:13 PST 2013
Looks good to me. This proposed change will also provide a consistent
picking framework for 2D and 3D primitives.
Thanks,
- Chien
On 2/1/2013 8:51 AM, Pavel Safrata wrote:
> Hello,
> this is related to the 3D support planned for FX8, yet it is a bugfix
> of an existing issue.
>
> With perspective camera, events delivered to any node that's not lying
> flat on the XY plane contain wrong local coordinates - they ignore the
> projection transformations. It's enough to rotate a rectangle along X
> axis and the coordinates become useless.
>
> http://javafx-jira.kenai.com/browse/RT-28129
>
> Solution to this problem requires API changes, because we need to
> compute in 3D to get proper numbers. So I propose to add a "double
> getZ()" method to all picking-based events, with the following
> semantics: the event's getSceneX(), getSceneY() values still represent
> the 2D coordinates of the mouse in the window content pixels (screen
> coordinates minus window position and decorations); the getX(),
> getY(), getZ() represent the hit point in the local 3D space (which
> may now be different even for scene because of the perspective
> transform). If no node is picked, the hit point with the scene will be
> found on the projection plane. Note that nothing changes for the 2D
> case, for the 3D case we now have correct 3D coordinates instead of a
> complete nonsense.
>
> There is one more issue - how to pass the correct coordinates to the
> event constructors. Instead of creating more construrctors with the
> three additional coordinates, I propose to use a concept called
> PickResult which was briefly discussed earlier and will soon be part
> of a 3D API review. In short, it is an object that contains
> information about the pick for the event - the picked node, local
> coordinates of the hit and some 3D-specific stuff. For proper 3D
> support, it will anyway be necessary to pass the PickResult to the
> events and allow access to it; once this is done, the event can
> compute the coordinates from it. So I propose adding PickResult to the
> event constructors. Note that they've not been released yet, so we can
> modify them instead of adding new ones. Also note that for convenience
> of 2D use-cases, the constructors will accept a null PickResult and in
> this case compute PickResult values based on the passed event target
> and scene coordinates (which is sufficient for 2D case).
>
> Side note for those who remember the previous 3D API discussion: the
> PickResult is no longer restricted to 3d shapes, it is present always,
> with the 3D-specific fields having null values where not applicable.
>
>
> Summary of this proposal:
> Affected classes: MouseEvent, MouseDragEvent, DragEvent, GestureEvent,
> ContextMenuEvent and TouchPoint
> new methods: getZ(), getPickResult() (and extended semantics of event
> local coordinates for 3D case)
> modified methods: added PickResult to all constructors
>
> Concrete description of the PickResult and the proposed picking API
> can be found here:
> https://wikis.oracle.com/display/OpenJDK/Picking3dAPI
>
> Thanks,
> Pavel
>
More information about the openjfx-dev
mailing list