Гладкая трехмерная сетка в R - PullRequest
0 голосов
/ 25 декабря 2018

Я рисую трехмерную сетку человеческого лица.Данные можно найти в 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")

Результирующая трехмерная поверхностьвыглядит следующим образом: enter image description here На сетке трехмерной поверхности можно легко увидеть множество треугольников.Я хочу, чтобы эта сетка surace выглядела более гладкой, как показано ниже: enter image description here

Что я должен сделать в R, чтобы сгладить поверхностную сетку так, чтобы сетка выглядела каквторой, где сглаживаются видимые треугольные грани?Возможно, модель Фонга для затенения будет работать через функцию contour3d в пакете misc3d.Может кто-нибудь показать, как эта функция может быть применена к моим данным?

Я заметил, что у плоттерного пакета в R есть несколько довольно удобных способов создания поверхностной сетки:

library(plotly)

face <- plot_ly(
    x = vb[,1], y = vb[,2], z = vb[,3],
    type = "mesh3d"
)

face

Результирующая лицевая поверхностьсетка, как показано ниже: enter image description here

Поверхность сетки очень гладкая!Но я не могу контролировать ориентацию объекта plotly.js при его сохранении.Я также не мог сохранить его в формате PDF без дополнительных покупок.Я хотел бы знать, насколько точно волшебство создало эту сетку с гладкой поверхностью, даже когда я не предоставлял информацию о лице (это информация не предоставлена, только vb предоставлена)?Если волшебство, выполненное с помощью plotly, может быть выполнено другим способом в R, чтобы я мог настроить ориентацию при сохранении изображений и сохранить его в виде файла PDF без покупки, сохраняя при этом такой высокий уровень плавности?

1 Ответ

0 голосов
/ 25 декабря 2018

Вы можете использовать функцию rgl::addNormals(), чтобы поверхность выглядела более гладкой.Просто сделайте

try2 <- addNormals(try)

, а затем отобразите try2, используя shade3d.

. Для этого нужно усреднить нормали к каждой треугольной грани, встречающейся в вершине;затем затенение выполняется плавно по лицу, и вы получите что-то похожее на один из ваших других сюжетов.Смотрите example(addNormals) для демонстрации.

Кстати, rgl использует затенение Гуро в R, но затенение Фонга, когда вы используете rglwidget() для отображения той же поверхности в браузере.Они похожи, но Фонг выглядит немного лучше.

Вот что я получаю из примера с затенением Гуро:

enter image description here

Вот то же самое с затенением Фонга из браузера:

enter image description here

Наконец, вот что я получаю для вашей поверхности.Я изменил отображение на

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

и получил

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...