Я надеюсь, что кто-то с опытом может помочь в том, как вы готовите файлы формы из xyz-данных. Хороший пример хорошо подготовленного набора данных можно увидеть здесь здесь для кометы Чурюмов-Герасименко, хотя предыдущие шаги по созданию файл формы не предоставляются.
Я пытаюсь лучше понять, как применить поверхность к заданному набору координат XYZ. Использование декартовых координат прямо с R-пакетом "rgl", однако формы, которые обертываются, кажутся более трудными. Я нашел пакет R geometry
, который предоставляет интерфейс для функций QHULL. Я попытался использовать это для вычисления треугольных граней Делоне, которые затем можно построить в rgl
. Я не могу определить некоторые параметры, связанные с функцией delaunayn
, чтобы, возможно, управлять максимальными расстояниями, которые вычисляются этими гранями. Я надеюсь, что у кого-то здесь могут быть некоторые идеи по улучшению построения поверхности из данных xyz.
Пример с использованием набора данных "Stanford bunnny":
library(onion)
library(rgl)
library(geometry)
data(bunny)
#XYZ point plot
open3d()
points3d(bunny, col=8, size=0.1)
#rgl.snapshot("3d_bunny_points.png")
#Facets following Delaunay triangulation
tc.bunny <- delaunayn(bunny)
open3d()
tetramesh(tc.bunny, bunny, alpha=0.25, col=8)
#rgl.snapshot("3d_bunny_facets.png")
Этот ответ заставляет меня поверить, что может возникнуть проблема с реализацией R Qhull. Кроме того, я сейчас пробовал различные настройки (например, delaunayn(bunny, options="Qt")
) с небольшим эффектом. Опции Qhull выделены здесь
Edit:
Вот еще один (более простой) пример сферы. Даже здесь вычисление фасетов не всегда находит ближайшие соседние вершины (если вы поворачиваете шар, вы увидите некоторые грани, пересекающие внутренность).
library(rgl)
library(geometry)
set.seed(1)
n <- 10
rho <- 1
theta <- seq(0, 2*pi,, n) # azimuthal coordinate running from 0 to 2*pi
phi <- seq(0, pi,, n) # polar coordinate running from 0 to pi (colatitude)
grd <- expand.grid(theta=theta, phi=phi)
x <- rho * cos(grd$theta) * sin(grd$phi)
y <- rho * sin(grd$theta) * sin(grd$phi)
z <- rho * cos(grd$phi)
set.seed(1)
xyz <- cbind(x,y,z)
tbr = t(surf.tri(xyz, delaunayn(xyz)))
open3d()
rgl.triangles(xyz[tbr,1], xyz[tbr,2], xyz[tbr,3], col = 5, alpha=0.5)
rgl.snapshot("ball.png")