R中的平滑3D三角形网格

时间:2018-12-25 02:07:26

标签: 3d plotly interpolation rgl deldir

我正在绘制人脸的3D表面网格。数据可以在https://github.com/Patricklv/Smoothing-3D-surface处找到,其中vb.xlsx包含顶点,而it.xlsx包含面。

我的R代码如下:

library(xlsx)
library(rgl)

vb <- read.xlsx("C:\\Users\\<Username>\\Desktop\\vb.xlsx", sheetIndex = 1, header = F)
it <- read.xlsx("C:\\Users\\<Username>\\Desktop\\it.xlsx", sheetIndex = 1, header = F)
vb_mat <- t(as.matrix(vb))
vb_mat <- rbind(vb_mat, 1)
rownames(vb_mat) <- c("xpts", "ypts", "zpts", "")

it_mat <- t(as.matrix(it))
rownames(it_mat) <- NULL

vertices <- c(vb_mat)
indices <- c(it_mat)

try <- tmesh3d(vertices = vertices, indices = indices, homogeneous = TRUE, material = NULL, normals = NULL, texcoords = NULL)

shade3d(try, ambient = "darkgrey", specular = "white")

生成的3D表面如下: enter image description here 在3D表面网格上很容易看到很多三角形。我想使此surace网格看起来更平滑,就像下面显示的那样: enter image description here

我应该在R中做什么以使表面网格平滑,以使网格看起来像第二个网格,其中平滑可见的三角形面?也许用于阴影的Phong模型可以通过misc3d包中的contour3d函数工作。谁能证明该功能如何应用于我的数据?

我注意到R中的plotly包有一些非常方便的方法来创建曲面网格:

library(plotly)

face <- plot_ly(
    x = vb[,1], y = vb[,2], z = vb[,3],
    type = "mesh3d"
)

face

所得的面部网格如下: enter image description here

表面网格非常光滑!但是保存时我无法控制plotly.js对象的方向。如果不另外购买,我也无法将其另存为PDF文件。我想知道即使我不提供面部信息(不提供信息,仅提供vb)时,魔术如何创建此光滑表面网格?如果可以在R中以其他方式完成通过plotly进行的魔术处理,以便我可以在保存图片时自定义方向并将其保存为PDF文件而无需购买,同时仍然保持如此高的平滑度?

1 个答案:

答案 0 :(得分:2)

您可以使用rgl::addNormals()函数使表面看起来更平滑。随便

try2 <- addNormals(try)

,然后使用try2显示shade3d

这是对在顶点相交的每个三角形面的法线求平均的方法。然后在整个脸部上平滑地进行阴影处理,您将获得与其他绘图之一类似的效果。有关演示,请参见example(addNormals)

顺便说一句,rgl在R中使用Gouraud底纹,但是在您使用rglwidget()在浏览器中显示同一曲面时使用Phong底纹。它们相似,但是Phong看起来好一些。

这是我从带有Gouraud阴影的示例中得到的结果:

enter image description here

与浏览器中的Phong着色相同:

enter image description here

最后,这就是我从你那儿得到的东西。我将显示更改为

shade3d(try2, col="darkgrey", specular = "#202020")

得到

enter image description here