Гладкая трехмерная сетка в R
Я рисую трехмерную сетку человеческого лица. Данные можно найти по адресу 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")
Результирующая трехмерная поверхность выглядит следующим образом: Многочисленные треугольники можно легко увидеть на трехмерной поверхности сетки. Я хочу, чтобы эта сетка surace выглядела более гладкой, как показано ниже:
Что я должен сделать в R, чтобы сгладить сетку поверхности так, чтобы сетка выглядела как вторая, где сглаживаются видимые треугольные грани? Возможно, модель Фонга для затенения будет работать через функцию contour3d в пакете misc3d. Может кто-нибудь показать, как эта функция может быть применена к моим данным?
Я заметил, что пакет plotly в R имеет несколько удобных способов создания поверхностной сетки:
library(plotly)
face <- plot_ly(
x = vb[,1], y = vb[,2], z = vb[,3],
type = "mesh3d"
)
face
Полученная сетка лицевой поверхности выглядит следующим образом:
Поверхность сетки очень гладкая! Но я не могу контролировать ориентацию объекта plotly.js при его сохранении. Я также не мог сохранить его в формате PDF без дополнительных покупок. Я хотел бы знать, насколько точно волшебство создало эту сетку с гладкой поверхностью, даже когда я не предоставлял информацию о лице (это информация не предоставлена, только vb предоставлена)? Если волшебство, выполненное плотно, может быть сделано каким-то другим способом в R, чтобы я мог настроить ориентацию при сохранении изображений и сохранить его в виде файла PDF без покупки, сохраняя при этом такой высокий уровень плавности?
1 ответ
Вы можете использовать rgl::addNormals()
Функция, чтобы сделать поверхность более гладкой. Просто делать
try2 <- addNormals(try)
а затем отобразить try2
с помощью shade3d
,
Что это делает, так это усредняет нормали к каждой треугольной грани, встречающейся в вершине; затем затенение происходит плавно по всему лицу, и вы получите что-то похожее на один из ваших других сюжетов. Увидеть example(addNormals)
для демо.
КСТАТИ, rgl
использует затенение Гуро в R, но затенение Фонга при использовании rglwidget()
отображать ту же поверхность в браузере. Они похожи, но Фонг выглядит немного лучше.
Вот что я получаю из примера с затенением Гуро:
Вот то же самое с затенением Фонга из браузера:
Наконец, вот что я получаю для вашей поверхности. Я изменил дисплей на
shade3d(try2, col="darkgrey", specular = "#202020")
и получил