【问题标题】:Rendering 3D surfaces渲染 3D 表面
【发布时间】:2012-06-05 23:32:38
【问题描述】:

我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 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 很吸引人
  • 您当然可以在 rgl 中执行此操作(它提供了您需要的所有图形基元),它比您上面给出的任何一个示例(单个表面,凸包)。如果您发布示例数据,有人可能会试一试...
  • 输入是点云吗?您能否提供一张示例图片以了解密度?
  • 输入是一个点云 (x,y,z) 并且对于某些故障相对密集,对于其他故障则没有那么多。基本上,一些断层既有很好的特征(即地质是众所周知的),也有很好的参数化(许多定义的点)。其他故障没有很好地表征或参数化,有些介于两者之间。我的问题是试图创建一个我可以在 3D 中渲染的表面,看起来大约“正确”。这不是必须在科学上“正确”的东西,但不应该看起来明显错误(即断层表面自行闭合等)。

标签: r 3d geometry geometry-surface


【解决方案1】:

您如何确定这些点如何连接在一起作为一个曲面?按距离?这可能是一种方式,alphashape3d 包可能有用。否则,如果您确切知道它们是如何连接的,那么您可以直接使用rgl 结构将其可视化。

【讨论】:

  • 我有一系列的点来定义各自断面上的点。它们由地质学家/地震学家定义,他们基本上在空间中创建定义表面的点云。它们在整个表面具有不同的覆盖密度。有些只是对平面边缘的稀疏覆盖,有些则对边缘进行了非常详细的覆盖,并在许多点上定义了一个起伏的 3D 面。但我的主要问题是我不知道如何创建一个可以从不靠自身关闭的点云渲染的单面表面。
  • 我会在你的问题中扩展这个细节并说明它,它会帮助有人回答它。
  • 嗯,我认为大多数情况下使用 alphashape3d 和玩其他零碎的东西让我接近我想要的。这有点令人头疼,因为我必须手动更改 alpha 因子,直到我得到对我拥有的几何图形有意义的东西,但我可能可以通过分析点云来优化它。仍然存在一些特定奇怪错误的问题,但我认为它主要是格式化。谢谢。
  • 作为快速跟进,如果我将点之间的矩阵距离的第一个四分位数作为 alpha,我会得到一个合理的表示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
相关资源
最近更新 更多