用颜色绘制表面网格的指定区域
Plot specified area of a surface mesh with color
我有 3D 面板表面网格的数据。数据可用 here,其中 vb.xlsx 包含 7160 个 3D 顶点的坐标,it.xlsx 包含人脸信息。颜色 coding.txt 是一个 7160*1 的矩阵,元素为 1 或 2。我希望表面积(不仅仅是顶点!)被编码为 1 的顶点包围,以与覆盖区域不同的颜色绘制通过编码为 2.
的顶点
例如,如果覆盖鼻子和上唇的顶点编码为1,其他面部区域编码为2,那么我想绘制如下图:
其中鼻子和上唇的表面积为绿色,其他区域为灰色。
我生成灰色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 代码?
谢谢。
这是预期的结果吗?
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")
为表面着色的棘手之处在于决定如何使用颜色。您可以按顶点、按边或按面着色。你想按顶点来做。
只要您使用的是 rgl
版本 0.100.2 或更高版本,这就相对容易了。每个顶点指定一种颜色,并使用参数 meshColor = "vertices"
告诉 rgl
这就是您所做的。
例如,
shade3d(try2, col=c("green", "pink")[col], meshColor = "vertices", specular = "#202020")
这给出了
我有 3D 面板表面网格的数据。数据可用 here,其中 vb.xlsx 包含 7160 个 3D 顶点的坐标,it.xlsx 包含人脸信息。颜色 coding.txt 是一个 7160*1 的矩阵,元素为 1 或 2。我希望表面积(不仅仅是顶点!)被编码为 1 的顶点包围,以与覆盖区域不同的颜色绘制通过编码为 2.
的顶点例如,如果覆盖鼻子和上唇的顶点编码为1,其他面部区域编码为2,那么我想绘制如下图:
其中鼻子和上唇的表面积为绿色,其他区域为灰色。
我生成灰色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 代码?
谢谢。
这是预期的结果吗?
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")
为表面着色的棘手之处在于决定如何使用颜色。您可以按顶点、按边或按面着色。你想按顶点来做。
只要您使用的是 rgl
版本 0.100.2 或更高版本,这就相对容易了。每个顶点指定一种颜色,并使用参数 meshColor = "vertices"
告诉 rgl
这就是您所做的。
例如,
shade3d(try2, col=c("green", "pink")[col], meshColor = "vertices", specular = "#202020")
这给出了