42

経験のある人が、xyz データから形状ファイルを準備する方法を手伝ってくれることを願っています。適切に準備されたデータセットの好例は、 Churyumov-Gerasimenko 彗星についてここで見ることができますが、形状ファイルを作成するための前の手順は提供されていません。

特定の XYZ 座標セットにサーフェスを適用する方法をよりよく理解しようとしています。デカルト座標の使用は R パッケージ "rgl" で簡単ですが、ラップ アラウンド シェイプはより難しいようです。QHULL関数geometryへのインターフェースを提供するR パッケージを見つけました。私はこれを使って Delaunay 三角面を計算してみました。これらのファセットが計算される最大距離を制御する可能性がある関数に関連付けられているオプションのいくつかを理解できません。ここの誰かが、xyz データからサーフェスの構築を改善するためのアイデアを持っていることを願っています。rgldelaunayn

「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")

ここに画像の説明を入力

4

4 に答える 4

18

contour3dこれは、カーネル密度推定と の関数を使用したアプローチmisc3dです。それが適切に機能する値が見つかるまで、私は遊んでいましたlevels。完全に正確というわけではありませんが、微調整してより正確なサーフェスを取得できる場合があります。8GB を超えるメモリがある場合は、nここで行った以上に増やすことができる場合があります。

library(rgl)
library(misc3d)
library(onion); data(bunny)

# the larger the n, the longer it takes, the more RAM you need
bunny.dens <- kde3d(bunny[,1],bunny[,2],bunny[,3], n=150, 
    lims=c(-.1,.2,-.1,.2,-.1,.2)) # I chose lim values manually

contour3d(bunny.dens$d, level = 600, 
    color = "pink", color2 = "green", smooth=500)
rgl.viewpoint(zoom=.75)

ここに画像の説明を入力ここに画像の説明を入力

右の画像は下から見たもので、別のビューを示しています。

nin にはより大きな値を使用できますが、kde3d時間がかかり、配列が大きくなりすぎると RAM が不足する可能性があります。別の帯域幅を試すこともできます (ここではデフォルトを使用)。R-Feng & Tierney 2008 の等値面の計算と表示からこのアプローチを採用しました。


Rvcgパッケージを使用した非常によく似た等値面アプローチ:

library(Rvcg)
library(rgl)
library(misc3d)
library(onion); data(bunny)

bunny.dens <- kde3d(bunny[,1],bunny[,2],bunny[,3], n=150, 
    lims=c(-.1,.2,-.1,.2,-.1,.2)) # I chose lim values manually

bunny.mesh <- vcgIsosurface(bunny.dens$d, threshold=600)
shade3d(vcgSmooth(bunny.mesh,"HC",iteration=3),col="pink") # do a little smoothing

ここに画像の説明を入力

これは密度推定ベースのアプローチであるため、バニーの密度を増やすことで、もう少し効果を得ることができます。私もn=400ここを利用しています。コストは計算時間の大幅な増加ですが、結果のサーフェスははるかに優れています。

bunny.dens <- kde3d(rep(bunny[,1], 10), # increase density.
                    rep(bunny[,2], 10),
                    rep(bunny[,3], 10), n=400, 
                    lims=c(-.1,.2,-.1,.2,-.1,.2))

bunny.mesh <- vcgIsosurface(bunny.dens$d, threshold=600)
shade3d(vcgSmooth(bunny.mesh,"HC",iteration=1), col="pink")

ここに画像の説明を入力


より優れた、より効率的な表面再構築方法 (パワー クラスト、ポアソン表面再構築、ボール ピボット アルゴリズムなど) は存在しますが、R で実装されているものはまだありません。

関連する Stack Overflow の投稿には、いくつかの優れた情報とチェックアウトするためのリンク (コードへのリンクを含む) があります: 3D 点群からの表面再構築のための堅牢なアルゴリズム? .

于 2015-05-04T02:37:00.500 に答える
3

Rvcg2016 年 7 月にバージョン 0.14 に更新され、ボール回転面の再構築が追加されました。機能はvcgBallPivoting次のとおりです。

library(Rvcg) # needs to be >= version 0.14
library(rgl)
library(onion); data(bunny)

# default parameters
bunnybp <- vcgBallPivoting(bunny, radius = 0.0022, clustering = 0.2, angle = pi/2)
shade3d(bunnybp, col = rainbow(1000), specular = "black")
shade3d(bunnybp, col = "pink", specular = "black") # easier to see problem areas.

ここに画像の説明を入力 ここに画像の説明を入力

ボールのピボットとデフォルトのパラメータ設定は、スタンフォードバニーにとって完璧ではなく (コメントで cuttlefish44 が指摘しているようにradius = 0.0022、デフォルトよりも優れていますradius = 0)、サーフェスにいくつかのギャップが残っています。実際のバニーにはベースに 2 つの穴があり、いくつかのスキャン制限が他のいくつかの穴の原因になっています (ここで説明したように: https://graphics.stanford.edu/software/scanview/models/bunny.html )。より良いパラメーターを見つけることができるかもしれませんし、使用するのは非常に高速ですvcgBallPivoting(私のマシンでは約 0.5 秒) が、ギャップを埋めるために追加の労力や方法が必要になる場合があります。

于 2016-08-08T00:11:35.323 に答える
0

私は現在、2 種類の表面再構築を提供するパッケージRCGALを作成しています。これは、C++ ライブラリ CGAL (Computational Geometry Algorithms Library) のヘッダー ファイルにリンクするRcppCGALパッケージに基づいています。

これは、スタンフォードバニーの高度な前面再構築です。

ここに画像の説明を入力

以下は、既定のパラメーターを使用したスタンフォード バニーのポアソン曲面再構成です。

ここに画像の説明を入力

このメッシュはあまり正確ではありません。spacingパラメータの値を小さくすると、より正確なメッシュが得られます。

ここに画像の説明を入力

詳細については、このブログ投稿を参照してください。

于 2022-01-05T20:09:09.847 に答える