R中的平滑3D三角形网格
Smooth 3D trangular mesh in R
我正在绘制人脸的 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表面如下:
在 3D 表面网格上可以很容易地看到很多三角形。我想让这个表面网格看起来更平滑,就像下面显示的那样:
我应该在 R 中做什么来平滑表面网格,使网格看起来像第二个网格,其中可见的三角形面被平滑了?也许用于着色的 Phong 模型可以通过 misc3d 包中的 contour3d 函数工作。谁能展示如何将此功能应用于我的数据?
我注意到 R 中的 plotly 包有一些非常方便的创建表面网格的方法:
library(plotly)
face <- plot_ly(
x = vb[,1], y = vb[,2], z = vb[,3],
type = "mesh3d"
)
face
生成的面部表面网格如下:
表面网格非常光滑!但是我无法在保存时控制 plotly.js 对象的方向。如果不额外购买,我也无法将其保存为 PDF 文件。我想知道创建这个光滑表面网格的魔法有多巧妙,即使我没有提供面部信息(没有提供信息,只提供 vb)?如果 plotly 的魔法可以在 R 中以其他方式完成,这样我就可以在保存图片时自定义方向,并且可以在不购买的情况下将其保存为 PDF 文件,同时仍然保持如此高的流畅度?
您可以使用rgl::addNormals()
函数使表面看起来更光滑。就这样
try2 <- addNormals(try)
然后使用 shade3d
.
显示 try2
这样做的目的是对在顶点相交的每个三角形面的法线进行平均;然后在脸上平滑地完成阴影,你会得到类似于你的其他情节之一的东西。有关演示,请参阅 example(addNormals)
。
顺便说一句,rgl
在 R 中使用 Gouraud 着色,但当您使用 rglwidget()
在浏览器中显示相同的表面时使用 Phong 着色。他们很相似,但 Phong 看起来好一点。
这是我从高氏着色示例中得到的结果:
这与浏览器中的 Phong 着色相同:
最后,这是我为你的表面得到的。我将显示更改为
shade3d(try2, col="darkgrey", specular = "#202020")
得到了
我正在绘制人脸的 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表面如下:
我应该在 R 中做什么来平滑表面网格,使网格看起来像第二个网格,其中可见的三角形面被平滑了?也许用于着色的 Phong 模型可以通过 misc3d 包中的 contour3d 函数工作。谁能展示如何将此功能应用于我的数据?
我注意到 R 中的 plotly 包有一些非常方便的创建表面网格的方法:
library(plotly)
face <- plot_ly(
x = vb[,1], y = vb[,2], z = vb[,3],
type = "mesh3d"
)
face
生成的面部表面网格如下:
表面网格非常光滑!但是我无法在保存时控制 plotly.js 对象的方向。如果不额外购买,我也无法将其保存为 PDF 文件。我想知道创建这个光滑表面网格的魔法有多巧妙,即使我没有提供面部信息(没有提供信息,只提供 vb)?如果 plotly 的魔法可以在 R 中以其他方式完成,这样我就可以在保存图片时自定义方向,并且可以在不购买的情况下将其保存为 PDF 文件,同时仍然保持如此高的流畅度?
您可以使用rgl::addNormals()
函数使表面看起来更光滑。就这样
try2 <- addNormals(try)
然后使用 shade3d
.
try2
这样做的目的是对在顶点相交的每个三角形面的法线进行平均;然后在脸上平滑地完成阴影,你会得到类似于你的其他情节之一的东西。有关演示,请参阅 example(addNormals)
。
顺便说一句,rgl
在 R 中使用 Gouraud 着色,但当您使用 rglwidget()
在浏览器中显示相同的表面时使用 Phong 着色。他们很相似,但 Phong 看起来好一点。
这是我从高氏着色示例中得到的结果:
这与浏览器中的 Phong 着色相同:
最后,这是我为你的表面得到的。我将显示更改为
shade3d(try2, col="darkgrey", specular = "#202020")
得到了