callbacks {rgl} | R Documentation |
User callbacks on mouse events
Description
Set and get user callbacks on mouse events.
Usage
rgl.setMouseCallbacks(button, begin = NULL, update = NULL, end = NULL,
dev = cur3d(), subscene = currentSubscene3d(dev))
rgl.getMouseCallbacks(button,
dev = cur3d(), subscene = currentSubscene3d(dev))
rgl.setWheelCallback(rotate,
dev = cur3d(), subscene = currentSubscene3d(dev))
rgl.getWheelCallback(dev = cur3d(), subscene = currentSubscene3d(dev))
Arguments
button |
Which button? Use 1 for left, 2 for right, 3 for middle, 4 for wheel. Use 0 to set an action when no button is pressed. |
begin |
Called when mouse down event occurs |
update |
Called when mouse moves |
end |
Called when mouse is released |
rotate |
Called when mouse wheel is rotated |
dev , subscene |
The RGL device and subscene to work with |
Details
The set functions set event handlers on mouse events that occur within the current RGL window.
The begin
and update
events should be functions taking two arguments; these
will be the mouse coordinates when the event occurs. The end
event handler
takes no arguments. The rotate
event takes a single argument, which will be
equal to 1
if the user pushes the wheel away by one click, and 2
if
the user pulls the wheel by one click.
Alternatively, the handlers may be set to NULL
, the default value, in which case
no action will occur.
If a subscene has multiple listeners, the user action will still only be called for the
subscene that received the mouse event. It should consult par3d("listeners")
if it makes sense to take action on the whole group of subscenes.
The get function retrieves the callbacks that are currently set.
The “no button” mouse handler may be set by
specifying button = 0
. The begin
function will be called the first time the mouse
moves within the subscene, and the update
function will be called repeatedly as it moves. The
end
function will never be called.
Value
The set functions are called for the side effect of setting the mouse event handlers.
The rgl.getMouseCallbacks
function returns a list containing the callback functions or NULL
if no user callback is set.
The rgl.getWheelCallback
returns the callback function or NULL
.
Author(s)
Duncan Murdoch
See Also
par3d
to set built-in handlers,
setUserCallbacks
to work with rglwidget
.
Examples
pan3d <- function(button, dev = cur3d(), subscene = currentSubscene3d(dev)) {
start <- list()
begin <- function(x, y) {
activeSubscene <- par3d("activeSubscene", dev = dev)
start$listeners <<- par3d("listeners", dev = dev, subscene = activeSubscene)
for (sub in start$listeners) {
init <- par3d(c("userProjection","viewport"), dev = dev, subscene = sub)
init$pos <- c(x/init$viewport[3], 1 - y/init$viewport[4], 0.5)
start[[as.character(sub)]] <<- init
}
}
update <- function(x, y) {
for (sub in start$listeners) {
init <- start[[as.character(sub)]]
xlat <- 2*(c(x/init$viewport[3], 1 - y/init$viewport[4], 0.5) - init$pos)
mouseMatrix <- translationMatrix(xlat[1], xlat[2], xlat[3])
par3d(userProjection = mouseMatrix %*% init$userProjection, dev = dev, subscene = sub )
}
}
rgl.setMouseCallbacks(button, begin, update, dev = dev, subscene = subscene)
cat("Callbacks set on button", button, "of RGL device", dev, "in subscene", subscene, "\n")
}
open3d()
shade3d(icosahedron3d(), col = "yellow")
# This only works in the internal display...
pan3d(1)