是否可以在没有索引信息的情况下创建 mesh3d 对象?

Is it possible to create mesh3d objects without indices information?

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

Here 是我的数据输入。必须存入GitHub因为太大直接放这里

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

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

错误。mesh3d.default(变形,三角形= T): 长度(x)%%3 == 0 不正确

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

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

有几个选项。您可以使用 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点;我真的看不出应该如何合并它们。