如何使用 RGL 中的 tmesh3d 在 RGL 中使用 shade3d 或 wire3d 制作 3D 网格

Posted

技术标签:

【中文标题】如何使用 RGL 中的 tmesh3d 在 RGL 中使用 shade3d 或 wire3d 制作 3D 网格【英文标题】:How to make a 3D Mesh in RGL with shade3d or wire3d using tmesh3d in R 【发布时间】:2016-01-13 18:05:24 【问题描述】:

我有一些我收集的数据。

它由顶点和三角形组成,我使用网格划分软件制作。

我可以将 R 与

一起使用

trimesh(三角形,顶点)

制作漂亮的网格图。

但不知道如何使用 RGL 制作我可以查看的交互式绘图,并且我不知道如何根据数据框中的不同值为网格的面着色。

这里是数据框中的顶点。 x, y, z 是节点/点的坐标 (nn)

'data.frame':   23796 obs. of  7 variables:
 $ nn : int  0 1 2 3 4 5 6 7 8 9 ...
 $ x  : num  39.5 70.8 49 83.5 -16 ...
 $ y  : num  28.2 -2.97 -25.67 -9.1 -39.75 ...
 $ z: num  160 158 109 121 188 ...
 $ uni: num  3.87 6.64 5.02 4.48 1.91 ...
 $ bi : num  0.749 0.784 1.045 0.935 0.733 ...




nn  x   y   z   uni bi
0   39.527  28.202  160.219 3.86942 0.74871
1   70.804  -2.966  157.578 6.64361 0.78373
2   48.982  -25.674 109.022 5.02491 1.0451
3   83.514  -9.096  120.988 4.47977 0.9348
4   -16.04  -39.749 188.467 1.90873 0.73286
5   74.526  -3.096  174.347 8.4263  0.70594
6   54.93   -56.347 151.496 7.53334 2.17128
7   56.936  -20.131 186.177 7.16118 1.44875
8   -14.627 -47.1   162.185 2.13939 0.70887
9   38.207  -59.201 147.993 5.83457 4.32971
10  50.645  -32.04  110.418 5.3741  1.14543

顶点的三角形是

'data.frame':   47602 obs. of  7 variables:
 $ X  : int  3435 3161 18424 13600 1564 21598 21283 1171 51 9331 ...
 $ Y  : int  19658 17204 17467 19721 10099 19018 11341 2723 15729 5851 ...
 $ Z  : int  2764 9466 16955 2669 10091 21205 18399 20833 15865 9106 ...


X   Y   Z
3435    19658   2764
3161    17204   9466
18424   17467   16955
13600   19721   2669
1564    10099   10091
21598   19018   21205
21283   11341   18399
1171    2723    20833
51  15729   15865
9331    5851    9106
310 3513    9121
5651    11928   15468  
8594    2295    6852
22725   22636   11114

我需要像在 trimesh 中一样将其制成网格,但是使用 RGL,我需要根据 uni 的比例为网格的面着色,其中 1.5 是绿色

It looks something like this in trimesh but how to i do it in RGL for R, WITH COLOURING BASED ON VALUE ON UNI in the first data table

【问题讨论】:

当我尝试 shade3d( tmesh3d(vert,face)) 我得到错误 x$vb[1, x$it] : subscript out of bounds 与同质性有关吗?即我有非同质数据,因为顶点数据框小于索引?如果是这样,我该如何解决? 我不明白你的三角形数据框的格式。它应该是一个矩阵,每行包含顶点矩阵的列的索引,对应于哪个顶点在哪个三角形中。也许如果你发布一个人们可以运行的完整示例,有人会告诉你如何去做。 如何发布整个数据框。节点是 20000+ 行和顶点 40000+。顶点实际上是每个节点的数据框 不要发布所有数据。想出一个只需要网格中几个三角形的简单示例,然后发布。 dput() 适合发布结构化数据。 【参考方案1】:

这是一个示例,从两个数据帧开始。

> library(rgl)
> vertices
   x  y  z
1  1 -1  1
2  1 -1 -1
3  1  1 -1
4  1  1  1
5 -1 -1  1
6 -1 -1 -1
7 -1  1 -1
8 -1  1  1
> triangles
  T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12
1  5  5  1  1  2  2  6  6  8   8   1   1
2  1  4  2  3  6  7  5  8  4   3   6   5
3  4  8  3  4  7  3  8  7  3   7   2   6

你需要矩阵来处理tmesh3d。必须将一行1 添加到顶点表中。

verts <- rbind(t(as.matrix(vertices)),1)
trgls <- as.matrix(triangles)
tmesh <- tmesh3d(verts, trgls)

现在您可以绘制网格了:

wire3d(tmesh)

关于颜色,你必须为每个三角形关联一种颜色:

tmesh$material <- list(color=rainbow(ncol(trgls)))
wire3d(tmesh)

> shade3d(tmesh)

更新 2019-03-09

rgl (0.100.18) 的最新版本允许对材质颜色进行不同的解释。

您可以为每个面指定颜色:

vertices <- as.matrix(vertices)
triangles <- as.matrix(triangles)
mesh1 <- tmesh3d(
  vertices = t(vertices),
  indices = triangles,
  homogeneous = FALSE,
  material = list(color = rainbow(ncol(triangles)))
)
shade3d(mesh1, meshColor = "faces")

或为每个顶点指定颜色:

mesh2 <- tmesh3d(
  vertices = t(vertices),
  indices = triangles,
  homogeneous = FALSE,
  material = list(color = rainbow(nrow(vertices)))
)
shade3d(mesh2, meshColor = "vertices")

【讨论】:

以上是关于如何使用 RGL 中的 tmesh3d 在 RGL 中使用 shade3d 或 wire3d 制作 3D 网格的主要内容,如果未能解决你的问题,请参考以下文章

如何在rgl中增加spheres3d的平滑度

使用 Mac OS X 加载 rgl 包时出错

R:rgl 包的 writePLY 函数未正确写入顶点颜色

R:将rgl小部件组合并保存为单个html文件

R语言使用rgl包的plot3d函数可视化可以交互旋转的3D散点图(Rotating 3D scatter plot produced by the plot3d functio in rgl)

glEnd 错误 (mesa-libGL/GLU) 在 Centos6.7 上安装“rgl”包