【问题标题】:Coloring Rgl 3d mesh faces着色 Rgl 3d 网格面
【发布时间】:2019-02-25 07:00:17
【问题描述】:

我想根据与顶点的接近程度为三角形 RGL 网格上的面着色。

问题是,似乎很多时候顶点与离实际顶点位置本身非常远的面相关联,当我想为一个顶点周围的面着色时会产生问题;这些面最终离重心的实际位置很远。

我现在正在做的是:

  1. 计算网格中所有面的重心。

  2. 使用 FAR 包计算距离所需点最近的 n 个重心。保留这些索引。

  3. 根据收集到的索引,为这些面涂上某种颜色。其余的面孔将被涂成白色。

    colors=rep('white',num_faces) colors[colored_faces]='red' mesh$material=list(color=colors)

  4. 然后我会绘制网格:plot3d(mesh)
  5. 问题是,我现在的颜色很奇怪,是否有任何既定的方法可以为接近某个坐标/顶点的面着色?

这是网格当前的样子,红色作为“彩色”面,蓝色作为我希望附近有彩色面的点。

Mesh

更新:看到this,我的问题现在修改为:

如何找到离给定点最近的人脸?我仍然不清楚,因为面重心有时会产生误导,并且不代表到给定顶点的实际距离。

更新 2

我在此处添加了示例代码和文件:Files and code

基本上,该代码使用最近邻算法找到与同一 3d 网格的给定顶点最近的面,然后我们在颜色向量中为这些面着色(记得为颜色着色 4 次):

除了,当我们运行这个算法时,我们只为形状的一侧着色:像这样: Odd

如何使颜色更加对称?

更新 3:此问题已解决!请查看 Rforge 上未发布的 rgl 版本,以获取允许对面、顶点和边缘进行着色的 rgl 最新版本。

更新 4:这是通过对最近的顶点着色的新图像(以表明新的 rgl 包可以创造奇迹):

Better Sink

【问题讨论】:

  • 如果您发布了一个可重现的小示例,将会很有帮助。我们不知道您从什么数据开始,因此很难告诉您如何处理它。该示例不需要足够完整来重现您的示例图形,只需具有相同结构的东西即可。

标签: r colors mesh rgl vcg


【解决方案1】:

您计算质心的代码不正确。你有

#Function for computing the barycenter/centroid of a face.
compute_face_centroid=function(vertices,face){
  vertex=vertices[,face][-4,]
  centroid=apply(X=vertex,MARGIN = 1,FUN = mean)
  return(centroid)
}

这只是删除了vertices 数组的第 4 行,这是将齐次坐标转换为欧几里得坐标的错误方法。您确实需要将其他行除以第 4 行。您可以使用rgl 函数asEuclidean 来做到这一点:

#Function for computing the barycenter/centroid of a face.
compute_face_centroid=function(vertices,face){
  vertex <- asEuclidean(t(vertices[,face]))
  apply(vertex, MARGIN = 2, FUN = mean)
}

您的代码中可能还存在其他问题,我还没有追踪所有内容。

顺便说一句,rgl 的未发布测试版本改变了在网格中处理颜色的方式,希望能简化这部分代码。如果您想尝试,可以从 R-forge.r-project.org 获得它。您现在可以按顶点或按面指定颜色。

编辑添加:

好的,我现在仔细看看。我认为您的代码实际上是有效的。 compute_face_centroid 应该更正,但由于您的示例始终具有最终组件的值 1,因此可以删除它。

颜色与预期不同的原因只是构成网格的三角形的形状确实不同。如果您将图像绘制为线框,您会看到:

wire3d(file)

那些细长三角形的质心离你选择的点很远。

【讨论】:

  • 您好,非常感谢您帮助我调查此问题!没有你的帮助,我不会想到这一点。最后一点,您可能知道新的配色方案是如何工作的吗?我已经下载了新版本的rgl;我会指定'meshcolor'=vertex/face/edge 并在'color'=colors 中为每个顶点/边缘/面索引包含一种颜色吗?再次非常感谢您,如果有什么我可以帮忙的,请告诉我是否可以提供帮助!
  • 是的,完全正确。对于您的问题,我建议找到n 最接近的顶点而不是质心。 meshColor = "vertices" 是默认值,但明确指定它可能是最安全的,以防默认值在发布时发生更改。
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2016-04-07
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多