【问题标题】:Move plane diagonally with rgl用rgl对角移动平面
【发布时间】:2017-08-03 21:37:32
【问题描述】:

我可以沿三个轴中的任何一个在 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")

【问题讨论】:

    标签: r rgl


    【解决方案1】:

    这并不容易。平面存储为 4 个三角形(因为平面与边界框相交时可以显示为六边形)。您需要计算对角线平面与每个所需值的边界框的交点,然后适当地更新三角形。

    将这些计算下推到 Javascript 中会更有意义,因此只存储平面的原始参数 (a,b,c,d),然后可以直接操作它们。也许有一天rgl 会这样做。

    编辑补充:实际上,rgl 已经在 J​​avascript 中进行了三角测量,但vertexControl 不知道如何要求它更改平面参数。从 0.98.12 版本开始(目前仅在 R-forge 上可用,很快在 Github 上的镜像中,有一天在 CRAN 上)它确实如此。

    您可以使用适当的a,b,c,d 参数指定平面 要获得您想要的角度,然后使用参数values = r, vertices = 1, attributes = "offset" 调用vertexControl 来更改平面的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 的东西。打印小部件时会自动发生。)

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多