渲染3D表面

3
我有代表3D表面(例如地震断层面)的数据,以xyz点格式表示。我想创建这些表面的3D表示。我尝试使用rgl和akima,但是无法处理可能折回自身或在相同的x,y点具有多个z值的几何形状。另外,使用几何形状(来自qhull的convhulln函数)可以创建在rgl中漂亮显示的凸包,但这些是封闭表面,在现实中,对象是开放的(不完全包围点集)。是否有一种方法可以创建这些表面并渲染它们,最好在rgl中?
编辑
为了澄清,这些点是定义表面的点云。它们在表面上具有不同的密度覆盖。然而,主要问题是表面是单面的,不封闭,并且我不知道如何生成非封闭的网格/表面以用于更复杂的几何形状。
例如...
require(rgl)
require(akima)
faultdata<-cbind(c(1,1,1,2,2,2),c(1,1,1,2,2,2),c(10,20,-10,10,20,-10))
x <- faultdata[,1]
y <- faultdata[,2]
z <- faultdata[,3]
s <- interp(x,z,y,duplicate="strip")
surface3d(s$x,s$y,s$z,col=a,add=T)

这基本上创建了我想要的东西。但是,对于更复杂的平面来说,这并不一定适用。例如,数据如下:

faultdata<-cbind(c(2,2,2,2,2,2),c(1,1,1,2,2,2),c(10,20,-10,10,20,-10))

我不能使用这种方法,因为所有的点都是垂直共面的。同样的问题也使我不能使用convhulln,而且一般来说我不想要一个封闭的外壳,我想要一个表面。我看了一下alphashape3d,它看起来很有前途,但我不确定如何在这个问题上使用它。


你可能会对基于WebGL的库感兴趣,比如PhiloGL。这个demo非常吸引人。 - CapelliC
你肯定可以在rgl中完成这个任务(它提供了所有你需要的图形原语),只是比你上面给出的任何一个例子(单一曲面、凸包)更困难,因为没有像它们那样预先打包好的功能。如果你发布示例数据,也许就会有人试一试…… - Ben Bolker
输入是点云吗?你能提供一张示例图片来了解密度吗? - sloriot
输入是一组点云 (x,y,z),对于某些故障,点云相对密集,而对于其他故障,则不是这样。基本上有些故障既被很好地表征(即地质学性质被很好地了解),又被很好地参数化(有很多定义好的点)。其他故障则未被很好地表征或参数化,有些位于两者之间。我的问题在于尝试创建一个表面,可以在 3D 中呈现出大致正确的外观。这并不一定需要科学上的“正确”,但不应该看起来明显错误(例如,断层表面闭合在自身内部等)。 - DWAHL
1个回答

2

如何确定点如何连接成表面?通过距离吗?这可能是一种方法,alphashape3d包可能会有用。否则,如果您确切地知道它们如何连接,那么可以使用rgl结构直接可视化。


我有一系列定义各自断层面上点的点。它们由地质学家/地震学家定义,基本上在空间中创建了一个定义表面的点云。它们在表面上具有不同的覆盖密度。有些只是平面边缘的稀疏覆盖,而其他一些则具有非常详细的边缘覆盖和在许多点上定义的起伏的三维面。但我的主要问题是我不知道如何创建一个单面的表面,可以从点云中呈现出来,而不会重新闭合。 - DWAHL
我建议您在问题中详细阐述并举例说明,这将有助于其他人回答。 - mdsumner
嗯,我认为大部分情况下使用alphashape3d并玩弄其他一些细节可以让我接近我想要的结果。这有点头疼,因为我必须手动更改alpha因子,直到我得到适合我所拥有的几何形状的东西,但我可能可以通过分析点云来优化它。仍然存在一些特定的奇怪错误,但我认为这主要是格式问题。谢谢。 - DWAHL
作为快速跟进,如果我取点之间矩阵距离的第一四分位数作为alpha的合理表示。 - DWAHL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接