1

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

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

我现在正在做的是这样的:

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

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

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

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

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

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

更新:看到这个,我的问题现在已经修改为:

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

更新 2

我在这里添加了示例代码和一个文件:文件和代码

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

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

如何使颜色更加对称?

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

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

更好的水槽

4

1 回答 1

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)

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

在此处输入图像描述

于 2018-09-23T23:20:03.720 回答