私が達成したいのは、rglで3Dグラフを表示し、表示したいビューに回転させてからファイルに保存することです。rgl.snapshot
私は次のような関数でこれを行うことができることを知っています:
library(rgl)
x <- runif(20)
y <- runif(20)
z <- runif(20)
plot3d(x, y, z)
rgl.snapshot("rgl.snapshot.png")
問題は、rgl.snapshot
画面解像度でファイルを生成するため、印刷に十分な解像度ではないことです。ファイルが保存される解像度に影響を与える方法はありません。一般に、ファイルをpdfやsvgなどのベクター形式で保存できればさらに良いでしょう。
scatter3D
私のアイデアは、現在のビューの回転を保存し、それをplot3D
パッケージのような非インタラクティブな 3D 散布図を生成する別の関数で使用することでした。回転行列を保存するために、次のことを行いました。
rotationMatrix <- rgl.projection()
次のようにすることもできます。
rotationMatrix <- par3d()$modelMatrix
回転行列は次のようになります。
$model
[,1] [,2] [,3] [,4]
[1,] 0.9584099 0.0000000 0.0000000 -0.4726846
[2,] 0.0000000 0.3436644 0.9792327 -0.6819317
[3,] 0.0000000 -0.9442102 0.3564116 -3.6946754
[4,] 0.0000000 0.0000000 0.0000000 1.0000000
$proj
[,1] [,2] [,3] [,4]
[1,] 3.732051 0.000000 0.000000 0.00000
[2,] 0.000000 3.732051 0.000000 0.00000
[3,] 0.000000 0.000000 -3.863703 -14.36357
[4,] 0.000000 0.000000 -1.000000 0.00000
$view
x y width height
0 0 256 256
ここで私の質問は、この回転行列から引数を取得しphi
、関数theta
で使用される引数を取得する方法です。scatter3D
library(plot3D)
# phi = ?
# theta = ?
pdf("scatter3D.pdf")
scatter3D(x, y, z, pch=20, phi = 20, theta =30, col="black")
dev.off()
回転行列から回転角度を抽出する数学があることは知っています。私の場合、それを適用する方法が本当にわかりません。特に、行列には 4 つの行と列があるためです。私はそれぞれ3つを期待します...次の問題は、scatter3D
2つの回転軸のみを使用することです(シータは方位角を表し、ファイは緯度を表します)。 -軸回転。ファイの回転軸は、シータの回転によって定義されると思います。
rgl スナップショットをロスレス形式で保存する別の方法があれば、ぜひ教えてください。