経験のある人が、xyz データから形状ファイルを準備する方法を手伝ってくれることを願っています。適切に準備されたデータセットの好例は、 Churyumov-Gerasimenko 彗星についてここで見ることができますが、形状ファイルを作成するための前の手順は提供されていません。
特定の XYZ 座標セットにサーフェスを適用する方法をよりよく理解しようとしています。デカルト座標の使用は R パッケージ "rgl" で簡単ですが、ラップ アラウンド シェイプはより難しいようです。QHULL関数geometry
へのインターフェースを提供するR パッケージを見つけました。私はこれを使って Delaunay 三角面を計算してみました。これらのファセットが計算される最大距離を制御する可能性がある関数に関連付けられているオプションのいくつかを理解できません。ここの誰かが、xyz データからサーフェスの構築を改善するためのアイデアを持っていることを願っています。rgl
delaunayn
「Stanford bunny」データセットを使用した例:
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")
この答えは、Qhull の R 実装に問題がある可能性があると私に信じさせます。また、さまざまな設定 (例: delaunayn(bunny, options="Qt")
) を試してみましたが、ほとんど効果がありませんでした。Qhull オプションの概要はこちら
編集:
これは、球の追加の (より単純な) 例です。ここでも、ファセットの計算で常に最も近い隣接頂点が見つかるとは限りません (ボールを回転させると、いくつかのファセットが内部を横切るのが見えます)。
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")