# Animating a ‘rgl’ mesh at constant speed

**Saturn Elephant**, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)

Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

The purpose of my package **qsplines** is to construct
quaternions splines. This is a port of the Python library
**splines**, written by Matthias Geier. A quaternions
spline is a sequence of quaternions interpolating some given
quaternions.

One feature I particularly like is the possibility to get a quaternions
spline having *constant speed*. I’m going to illustrate this
feature.

Firstly, I take some key points following a spherical curve on the unit ball. Then I will take, for each key point, a unit quaternion (“rotor”) which sends the first key point to this key point, through the rotation it corresponds to. The spherical curve I take is a so-called satellite curve.

# satellite curve # https://mathcurve.com/courbes3d.gb/satellite/satellite.shtml satellite <- function(t, R = 1, alpha = pi/2, k = 8) { c( cos(alpha) * cos(t) * cos(k*t) - sin(t) * sin(k*t), cos(alpha) * sin(t) * cos(k*t) + cos(t) * sin(k*t), sin(alpha) * cos(k*t) ) } # take key points running on the satellite curve nkeypoints <- 10L t_ <- seq(0, 2*pi, length.out = nkeypoints+1L)[1L:nkeypoints] keyPoints <- t(vapply(t_, satellite, numeric(3L)))

Now the rotors as previously described:

# construction of the key rotors; the first key rotor # is the identity quaternion and rotor i sends the # first key point to the i-th key point keyRotors <- quaternion(length.out = nkeypoints) rotor <- keyRotors[1L] <- H1 for(i in seq_len(nkeypoints - 1L)){ keyRotors[i+1L] <- rotor <- quaternionFromTo(keyPoints[i, ], keyPoints[i+1L, ]) * rotor }

And now the constant speed quaternions spline:

# Kochanek-Bartels quaternions spline interpolating the key rotors rotors <- KochanekBartels( keyRotors, n_intertimes = 10L, endcondition = "closed", tcb = c(0, 0, 0), constantSpeed = TRUE )

And now, with the help of this spline, we can construct an animation of
a **rgl** mesh rotating at constant speed. I take a mesh of
a Dupin cyclide.

library(rgl) mesh0 <- cgalMeshes::cyclideMesh( a = 97, c = 32, mu = 57, nu = 200L, nv = 200L ) open3d(windowRect = 50 + c(0, 0, 512, 512), zoom = 0.6) for(i in 1L:length(rotors)) { rotMatrix <- as.orthogonal(rotors[i]) mesh <- rotate3d(mesh0, matrix = rotMatrix) # this invisible sphere is used to fix the frame spheres3d(x = 0, y = 0, z = 0, radius = 200, alpha = 0) shade3d(mesh0, color = "chartreuse") png <- sprintf("pic%03d.png", i) snapshot3d(png, webshot = FALSE) clear3d() } # mount animation pngFiles <- Sys.glob("*.png") library(gifski) gifski( pngFiles, "cyclide_constantSpeed.gif", width = 512, height = 512, delay = 1/10 ) file.remove(pngFiles)

If you want to play with this stuff, you can change the parameters of
the satellite curve to get a different motion, and also change the
`tcb`

argument in the `KochanekBartels`

function
(tension, continuity, bias). There is a Shiny application in
**qsplines** allowing to visualize the effects of
`tcb`

.

**leave a comment**for the author, please follow the link and comment on their blog:

**Saturn Elephant**.

R-bloggers.com offers

**daily e-mail updates**about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.

Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.