到目前为止,我一直在尝试将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])
}
}
}
我能够移动观察者,但我不太想知道如何转换坐标,因此所选点出现在视图的中心。
答案 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
渲染场景时进行的完整转换序列。