RGL Observer3d:如何将视图集中在所选点上?

时间:2018-07-19 20:56:51

标签: r rgl

到目前为止,我一直在尝试将rgl观察器的中心放在先前用identify3d选择的点上,但收效甚微。 这是一个(不可行的)示例:

library(rgl)  
if (interactive()) {  
      x <- rnorm(1000)  
      y <- rnorm(1000)  
      z <- rnorm(1000)  
      open3d()  
      points3d(x, y, z)  
      while(interactive()) {   
        keep <- identify3d(x, y, z, n=1, plot=F)  
        if (!is.null(keep)) {  
          observer3d(x[keep],  
                     y[keep],  
                     par3d("observer")[3])   
        }  
      }  
    }  

我能够移动观察者,但我不太想知道如何转换坐标,因此所选点出现在视图的中心。

1 个答案:

答案 0 :(得分:2)

我认为您不希望观察者在特定点上,而是希望平移场景以使该点位于视图的中心。您可以通过乘以par3d("userMatrix")值来实现 通过translationMatrix(x, y, z)进行选择,其中args被选择移动 指向中间的点。

如果您也不想在翻译之间进行轮换或其他用户更改,则这样做非常容易。如果这样做,那么您需要 在每次更改之前先阅读par3d("userMatrix"),然后 在应用新翻译之前,请撤消之前的翻译。

例如,

library(rgl)
if (interactive()) {  
  x <- rnorm(10)  
  y <- rnorm(10)  
  z <- rnorm(10)  
  open3d() 
  text3d(x, y, z, seq_along(x)) 
  center <- c(0.5, 0.5) %*% matrix(par3d("bbox"), 2, 3) 
  prev <- c(0, 0, 0)  # initially, no translation
  while(interactive()) {   
    keep <- identify3d(x, y, z, n=1, plot=F)  
    pt <- c(x[keep], y[keep], z[keep])
    xlat <- center - pt  # undo automatic centering and center on the point
    userMatrix <- par3d("userMatrix")
    par3d(userMatrix = userMatrix %*% t(translationMatrix(xlat[1] - prev[1], 
                                                          xlat[2] - prev[2], 
                                                          xlat[3] - prev[3])))
    prev <- xlat
    }  
  }  

如果您也正在缩放,这可能无法正常工作;请参阅?par3d帮助主题,以获取rgl渲染场景时进行的完整转换序列。