我可以沿着三个轴中的任意一个移动平面穿过RGL场景(例如,参见下面的示例),但是如何沿着对角线移动一个平面(沿着垂直于平面的对角线移动,如果平面不垂直于轴)?此外,运行到边界框会导致问题吗?我不知道是否可以使用vertexControl,但我也不知道如何使用ageControl。
library(rgl)
xyz <- matrix(rnorm(300), ncol = 3)
plotid <- plot3d(xyz)
planeid <- planes3d(0, 0, 1, 0, col = "blue")
r <- c(-3,3)
widge = rglwidget() %>%
playwidget(vertexControl(values = matrix(r, 2, 6),
vertices = 1:6, attributes = "z", objid = planeid, param = r),
start = r[1], stop = r[2], step = 0.1, precision = 2,
components = c("Play", "Slider", "Label"))
htmltools::save_html(widge, "Rtemporary/Example1.html")
答案 0 :(得分:1)
这并不容易。平面存储为4个三角形(因为当平面与边界框相交时,平面可以显示为六边形)。您需要为所需的每个值计算对角线平面与边界框的交点,然后适当地更新三角形。
将这些计算推入Javascript会更有意义,因此只存储平面的原始参数(a,b,c,d),然后可以直接操作它们。也许有一天rgl
会这样做。
编辑添加:实际上,rgl
已经在Javascript中进行了三角测量计算,但vertexControl
不知道如何要求它更改平面参数。从版本0.98.12开始(目前仅适用于R-forge,很快就会出现在Github的镜像中,有一天会出现在CRAN上)。
您可以使用适当的a,b,c,d
参数指定平面
要获得所需的角度,请使用参数vertexControl
调用values = r, vertices = 1, attributes = "offset"
以更改平面的d
设置。你的例子看起来像这样:
library(rgl)
xyz <- matrix(rnorm(300), ncol = 3)
plotid <- plot3d(xyz)
planeid <- planes3d(1, 1, 1, 0, col = "blue")
r <- c(-3,3)
rglwidget() %>%
playwidget(vertexControl(values = r,
vertices = 1, attributes = "offset", objid = planeid, param = r),
start = r[1], stop = r[2], step = 0.1, precision = 2,
components = c("Play", "Slider", "Label"))
(不需要save_html
内容。当您打印小部件时会自动发生这种情况。)