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

问题描述

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

Here是我的数据的输出。我必须将其存放在GitHub中,因为它太大而不能直接放在这里。

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

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

as.mesh3d.default中的错误(变形,三角形= T): length(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))

screenshot

即使将点随机重新排列也可以,但是实际上,如果您进行绘图

plot3d(nose,type = "l")

您会看到这些点是非常有规律地组织的:

screenshot2

如果可以弄清楚它们的组织方式,则可以将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,nrow=20)
m2y <- matrix(nose[324:623,nrow=20)
m2z <- matrix(nose[324:623,nrow=20)
mx <- cbind(m1x[,15:1],m2x)
my <- cbind(m1y[,m2y)
mz <- cbind(m1z[,m2z)
library(rgl)
open3d()
surface3d(mx,my,mz,col = "gray")

screenshot3

您会看到alpha3d情节充满了鼻子的一面。但是,这一点忽略了23分。我真的看不到应该如何合并它们。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...