rgl observer3d:如何将视图集中在所选点上?

rgl observer3d: how to center view on selected point?

我一直在尝试将 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])   
        }  
      }  
    }  

我可以移动观察者,但我不太清楚如何转换我的坐标以使所选点出现在我的视图中心。

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

如果您不想在翻译之间允许旋转或其他用户更改,这很容易做到。如果你这样做,那么你需要 在每次更改之前阅读 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 在渲染场景时执行的完整转换序列。