【发布时间】:2021-11-16 04:46:16
【问题描述】:
这是一个 3D 面部表面网格示例。从下面的图 1 可以看出,地标是双边对称的。我希望减少地标的数量。
这里face是顶点的坐标,triang是三角剖分文件,landPairs是一个包含顶点配对信息的两列文件。 landPairs 不用于稍后的绘图,但在需要时提供。所有数据均来自here:
这是在抽取之前绘制原始顶点的代码:
library(rgl)
library(Rvcg)
# Customized function to convert vb and it information to 3D mesh
lm2mesh <- function(vb, it) {
vb <- t(vb)
vb <- rbind(vb, 1)
rownames(vb) <- c("xpts", "ypts", "zpts", "")
it_mat <- t(as.matrix(it))
rownames(it_mat) <- NULL
vertices <- c(vb)
indices <- c(it_mat)
tmesh3d(vertices = vertices, indices = indices, homogeneous = TRUE,
material = NULL, normals = NULL, texcoords = NULL)
}
# Load `face` and `triang`
face <- as.matrix(read.csv("<PATH>\\SampleFace.csv", header=F))
triang <- as.matrix(read.csv("<PATH>\\triangulation.csv", header=F))
facemesh <- lm2mesh(face,triang)
# Plot the undecimated mesh
shade3d(facemesh, col="steelblue", specular = "#202020", alpha = 0.7)
plot3d(face, type = "s", col = "red", xlab = "x", ylab = "y", zlab = "z",
size = 0.2, aspect = FALSE, alpha = 0.8, add=T)
# Plot the decimated mesh
open3d()
facemeshdecim <- vcgQEdecim(facemesh,percent=0.1)
shade3d(facemeshdecim, col="steelblue", specular = "#202020", alpha = 0.7)
plot3d(t(facemeshdecim$vb[-4, ]), type = "s", col = "red", xlab = "x", ylab = "y", zlab = "z",
size = 0.4, aspect = FALSE, alpha = 0.8, add=T)
可以看出,在抽取的面中,顶点的间距不像抽取之前那样均匀,原本对称的顶点变得不再对称。 我的问题是,是否有一种方法可以减少顶点数量,同时确保减少的顶点尽可能均匀分布并保持顶点的双边对称性?
【问题讨论】:
-
我不知道现有的方法来做你想做的事,但如果我想这样做,我会使用
rgl::clipMesh3d()沿着对称线切割网格,抽取结果,然后在对称线上复制结果。一切都很简单,除了在最后加入两半,您需要为此编写一些代码。
标签: r 3d visualization mesh rgl