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

时间:2016-01-13 18:05:25

标签: r mesh rgl

我收集了一些数据。

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

我可以使用R和

trimesh(三角形,顶点)

制作漂亮的网格图。

但是无法弄清楚如何使用RGL创建一个我可以查看的交互式绘图,而我无法根据数据中的不同值来弄清楚如何为网格的面部着色帧。

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

@import url('href="//fonts.googleapis.com/css?family=Arvo');

顶点的三角形是

'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

我需要在三角形中将其制作成网格,但是使用RGL并且我需要根据uni的比例对网格的面进行着色,其中< 0.5为红色,0 / 5-1 / 5是橙色,> 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

1 个答案:

答案 0 :(得分:0)

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

> 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)

enter image description here

关于颜色,您必须将一种颜色与每个三角形相关联:

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

enter image description here

> shade3d(tmesh)

enter image description here

更新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")

enter image description here

或为每个顶点指定颜色:

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

enter image description here