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
在渲染场景时执行的完整转换序列。
我一直在尝试将 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
在渲染场景时执行的完整转换序列。