R: создать анимированный gif в rgl с вращением вокруг оси Z
Мне нужно создать анимированный gif из пакета визуализации OpenGL rgl
в R. Рецепт описан в этой ссылке на genomearchitecture.com. Сначала мы создаем 3D-куб с нашим изображением. Он был изготовлен в plot3D
пакете с помощью scatter3D()
команд. Затем мы вызываем окно rgl с помощью
require(plot3Drgl)
plotrgl()
Рецепт из приведенной выше ссылки звучит следующим образом (существенная часть):
for (i in 1:90) {
view3d(userMatrix=rotationMatrix(2*pi * i/90, 1, -1, -1))
rgl.snapshot(filename=paste("animation/frame-",
sprintf("%03d", i), ".png", sep=""))
}
то есть мы создаем 90 снимков rgl и поворачиваем наш объект, используя параметры в userMatrix=rotationMatrix()
. Однако именно эта директива выполняет вращение вокруг некоторой определенной оси, и вся вращающаяся анимация выглядит странно, особенно если у нас есть только 3D-географическая карта для вращения, как на этом изображении.
Мы не хотим, чтобы это изображение вращалось и перевернулось вверх, нам просто нужно повернуть его вокруг вертикальной оси Z. Тем не менее, каждая попытка изменить директиву view3d(userMatrix=rotationMatrix(2*pi * i/90, 1, -1, -1))
меняет вектор (1, -1, -1) создает куб с Z, обращенная к нам с исходным положением угла. В статической структуре положение куба можно интуитивно контролировать двумя полярными координатами через директиву
plotdev(theta=10,phi=15)
Было бы неплохо запрограммировать моментальные снимки, запускающие theta от 0 до 2 pi с некоторыми разумными phi, но установка theta, phi вместо userMatrix отлично работает только для статического изображения. В окне rgl он снова производит что-то не ожидаемое, например, theta = 0, phi = 0 снова направляет ось Z к нам. Как можно изменить директиву угла обзора, чтобы заставить куб вращаться вокруг своей оси Z?