虽然可以使用view3d(theta, phi,...)函数将观察点旋转到合适的位置,同时拍摄3d图表/对象的快照,但很难猜测theta和phi值中的哪一个更好。
一旦显示了图,我们就可以交互地旋转它。但是,有没有办法在手动旋转之后找出绘图的theta和phi参数,以便我们可以通过编程使用它(即,当创建许多应该具有相同视点的绘图时)?
发布于 2014-08-15 20:15:35
我自己一直在尝试解决这个问题,我想我已经找到了维护用户修改的交互式绘图的视角的答案。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参数,以同样的方式提取和使用信息。我认为这就是上面的Ali所需要的。
在自动生成多个绘图时调用persp3d有点不雅致,因为该函数实际上是为交互式绘图而设计的。我猜想你可以使用par3d中的userMatrix,zoom,fov,scale等信息,以及一些数学运算(例如Ali的)来确定phi,theta,r和d,并将它们直接放入persp中-而不是处理每个图的persp3d,但我还没有测试过。
发布于 2017-08-15 12:14:09
不需要提取视角。您可以提取userMatrix
um <- par3d()$userMatrix然后使用
view3d(userMatrix = um)将恢复视角。
发布于 2022-02-03 22:25:07
是的,在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)$zhttps://stackoverflow.com/questions/22257196
复制相似问题