用颜色绘制表面网格的指定区域

时间:2018-12-28 10:01:13

标签: r 3d interpolation rgl

我有3D面板表面网格的数据。数据可用here,其中vb.xlsx包含7160 3D顶点的坐标,而v.xlsx包含面信息。 color encoding.txt是一个7160 * 1的矩阵,元素为1或2。我希望编码为1的顶点所包围的表面积(不仅仅是顶点!)以与顶点所覆盖的区域不同的颜色绘制编码2。

例如,如果覆盖鼻子和上唇的顶点被编码为1,其他面部区域被编码为2,那么我希望绘制如下图:

enter image description here

鼻子和上唇的表面积为绿色,其他区域为灰色。

我生成灰色3D面部网格物体的代码如下:

library(geomorph)
library(xlsx)
library(rgl)

# Import data
vb <- read.xlsx("E:\\...\\vb.xlsx", sheetIndex = 1, header = F)
it <- read.xlsx("E:\\...\\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)

try2 <- addNormals(try)

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

现在,我要绘制包含绿色的编码为1的顶点和包含粉色的编码为2的顶点的表面积。我应该如何修改我的R代码?

谢谢。

2 个答案:

答案 0 :(得分:2)

在着色表面上棘手的事情是决定如何使用颜色。您可以按顶点,按边缘或按面着色。您想通过顶点来完成。

只要您使用的是rgl版本0.100.2或更高版本,这相对容易。为每个顶点指定一种颜色,然后使用参数meshColor = "vertices"告诉rgl,这就是您所做的。 例如,

shade3d(try2, col=c("green", "pink")[col], meshColor = "vertices", specular = "#202020")

给出

screen capture

此版本的rgl尚未在CRAN上使用,但在R-forgeGithub上可用。

答案 1 :(得分:0)

这是预期的结果吗?

library(rgl)
library(readxl)
# Import data
vb <- read_xlsx("vb.xlsx", sheet = 1, col_names = FALSE)
it <- read_xlsx("it.xlsx", sheet = 1, col_names = FALSE)
colorCoding <- read.table("Color coding.txt")$V1
colors <- c("darkgrey","midnightblue")[colorCoding]

vb_mat <- rbind(t(as.matrix(vb)), 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)

mesh <- addNormals(
  tmesh3d(vertices = vertices, indices = indices, homogeneous = TRUE,
          material = list(color=colors)))
shade3d(mesh, specular = "#202020")

enter image description here