20

While the view3d(theta, phi,...) function can be used to rotate the viewing point to a suitable location while taking snapshot of 3d charts/objects, it's quite hard to guess which theta and phi values are good.

Once the plot is shown, we can interactively rotate it. But is there anyway to find out the theta and phi parameters of the plot after manual rotation, such that we can use it programmatically (i.e. when creating many plots that should be of the same viewpoint)?

4

3 回答 3

13

我一直在尝试自己解决这个问题,我认为我有答案来维护用户修改的交互式情节的视角。view3d 只影响已经打开的窗口中的透视,关键是在实际生成绘图之前使用 open3d 设置窗口和透视。

换句话说,我们实际上不需要(直接)使用 phi 和 theta 角度信息。一旦您生成了一个交互式绘图并获得了您喜欢的透视图(您可能想要调整窗口大小或图像抓取将太小),类似以下的内容将提取所需的信息:

zoom<-par3d()$zoom
userMatrix<-par3d()$userMatrix
windowRect<-par3d()$windowRect

然后下面将以所需的大小和透视(和缩放)打开一个窗口,生成绘图,然后抓取图像。

open3d(zoom = zoom, userMatrix = userMatrix, windowRect=windowRect)
perps3d(x=x,y=y,z=z) # plus whatever arguments you need, but ignoring all perspective arguments
rgl.snapshot( filename, fmt="png", top=TRUE)

这是基本思想,可用于自动生成相同视角的图形。您还可以随意使用 par3d 中的 scale 或 fov 参数,使用相同的想法来提取和使用信息。我想这些都是上面阿里所需要的。

自动生成多个绘图时调用 persp3d 有点不雅,因为该函数确实是为交互式绘图而设计的。我怀疑您可以使用 par3d 中的 userMatrix、zoom、fov、scale 等信息以及一些数学(例如 Ali 的)来确定 phi、theta、r 和 d,并将这些直接放入 persp - 而不是为每个人处理 persp3d情节,但我还没有测试过。

于 2014-08-15T12:15:34.603 回答
4

无需提取视角。您可以提取 userMatrix

um <- par3d()$userMatrix

然后使用

view3d(userMatrix = um)

视角将恢复。

于 2017-08-15T04:14:09.277 回答
0

是的,一旦您在 RGL 设备窗口中手动旋转了视图,您就可以获得重新创建该视图所需的所有方向信息,无论您想使用什么坐标系。

从基本 rgl 包中,您可以获得:

myUserMatrix <- par3d()$userMatrix
myZoom <- par3d()$zoom
myObserver <- par3d()$observer

接下来安装 orientlib 包,因为我们将使用的两个函数依赖于该包

install.packages("orientlib")

然后使用您提取的 userMatrix,您可以使用 rglToBase 函数获取 theta 和 phi 变量以提取 theta 和 phi。

theta <- rglToBase(myUserMatrix)$theta
phi <- rglToBase(myUserMatrix)$phi

或者,您可以使用 rglToLattice 函数获取 x、y 和 z 坐标

x <- rglToLattice(myUserMatrix)$x
y <- rglToLattice(myUserMatrix)$y
z <- rglToLattice(myUserMatrix)$z
于 2022-02-03T22:25:06.650 回答