【问题标题】:Is it possible to create mesh3d objects without indices information?是否可以在没有索引信息的情况下创建 mesh3d 对象?
【发布时间】:2020-10-05 09:16:53
【问题描述】:

我有一个表示鼻子的地标矩阵。我希望将此矩阵转换为 mesh3d,以便我可以使用 shade3d 函数来可视化表面。

Here 是我的数据的输入。只好存入GitHub,因为太大,直接放在这里。

三列分别是 x、y 和 z 坐标。我想问一下如何将此矩阵转换为mesh3d。我试过as.mesh3d,但是因为顶点数不是3或4的倍数,所以返回错误。

mesh.d <- as.mesh3d(deformed, triangles = T)

as.mesh3d.default(deformed, triangles = T) 中的错误: 长度(x)%%3 == 0 不正确

我还尝试删除最后两行,以便我的数据有 621 行,这是 3 的倍数。然后我使用shade3d 进行绘图。但是,生成的绘图没有给出鼻子的表面网格。 mesh3d 函数不仅需要输入顶点,还需要输入我没有的索引。因此,我问是否可以将我的坐标矩阵转换为 R 中的 mesh3d 对象?

【问题讨论】:

    标签: r plotly mesh rgl


    【解决方案1】:

    索引描述了由三个顶点组成的三角形。如果您没有将它们提供给您,则需要以某种方式构建它们。

    有几个选项。您可以使用alphashape3d::ashape3d 函数来近似点的轮廓。需要选择alpha参数;例如,alpha = 20 我得到了

    ash <- ashape3d(as.matrix(nose), alpha=20)
    shade3d(as.mesh3d(ash))
    

    即使点是随机重新排列的,这也会起作用,但事实上,如果你绘制

    plot3d(nose, type = "l")
    

    你可以看到这些点是非常有规律的:

    如果你能弄清楚它们是如何组织的,你也许可以将 x、y 和 z 坐标重新排列成矩阵并使用surface3d() 来绘制它们。例如,这会绘制除前 23 个点之外的所有点:

    m1x <- matrix(nose[24:323,1], nrow=20)
    m1y <- matrix(nose[24:323,2], nrow=20)
    m1z <- matrix(nose[24:323,3], nrow=20)
    m2x <- matrix(nose[324:623,1], nrow=20)
    m2y <- matrix(nose[324:623,2], nrow=20)
    m2z <- matrix(nose[324:623,3], nrow=20)
    mx <- cbind(m1x[,15:1], m2x)
    my <- cbind(m1y[,15:1], m2y)
    mz <- cbind(m1z[,15:1], m2z)
    library(rgl)
    open3d()
    surface3d(mx, my, mz, col = "gray")
    

    您可以看到alpha3d 绘图过多地填充了鼻子的一侧。但是,这个忽略了 23 分;我真的看不出它们应该如何合并。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2017-06-25
      • 2019-04-06
      • 1970-01-01
      • 2020-09-09
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多