Гладкая трехмерная сетка в 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")

и получил

Другие вопросы по тегам