This function converts from 3-dimensional user coordinates
to 3-dimensional window coordinates.

```
rgl.user2window(x, y = NULL, z = NULL, projection = rgl.projection())
rgl.window2user(x, y = NULL, z = 0, projection = rgl.projection())
rgl.projection(dev = cur3d(), subscene = currentSubscene3d(dev))
```

## Arguments

- x, y, z
Input coordinates. Any reasonable way of defining the
coordinates is acceptable. See the function `xyz.coords`

for details.

- projection
The RGL projection to use

- dev, subscene
The RGL device and subscene to work with

## Details

These functions convert between user coordinates and window coordinates.

Window coordinates run from 0 to 1 in X, Y, and Z. X runs from 0 on the
left to 1 on the right; Y runs from 0 at the bottom to 1 at the top;
Z runs from 0 foremost to 1 in the background. RGL does not currently
display vertices plotted outside of this range, but in normal circumstances will automatically resize the
display to show them. In the example below this has been suppressed.

## Value

The coordinate conversion functions produce a matrix with columns corresponding
to the X, Y, and Z coordinates.
`rgl.projection()`

returns a list containing the following components:

- model
the modelview matrix

- projection
the projection matrix

- viewport
the viewport vector

See `par3d`

for more details.

## Author

Ming Chen / Duncan Murdoch

## Examples

```
open3d()
#> cleared GL_STACK_UNDERFLOW
points3d(rnorm(100), rnorm(100), rnorm(100))
if (interactive() || !.Platform$OS == "unix") {
# Calculate a square in the middle of the display and plot it
square <- rgl.window2user(c(0.25, 0.25, 0.75, 0.75, 0.25),
c(0.25, 0.75, 0.75, 0.25, 0.25), 0.5)
par3d(ignoreExtent = TRUE)
lines3d(square)
par3d(ignoreExtent = FALSE)
}
```