rgl segments3d用于连接三维散点以绘制骨架

时间:2017-11-22 12:44:21

标签: r rgl

我正在处理动作捕捉数据,并希望在3D中绘制两个骷髅(从两个不同系统获得的动作捕捉数据)。

我已设法绘制并标记关节,但我无法弄清楚如何将关节与线连接。

对以下样本数据集中使用的缩写的简短解释:
RA和LA(左右脚踝)
RK和LK(右膝和右膝)
RH和LH(左右臀部)
CG(重力中心)

简化数据集:

$HOME/.bashrc

到目前为止,我的代码用于绘制和标记两个系统中的关节:

df <- data.frame(
  Joint = c("LA", "RA", "LK", "RK", "LH", "RH", "CG", "LA", "RA", "LK", "RK", "LH", "RH", "CG"),
  system = c("A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B"),
  x = c(0, 10, 0, 10, 0, 10, 5, 0, 10, 0, 10, 0, 10, 5),
  y = c(0,0,0,0,0,0,0, 20,20,20,20,20,20,20),
  z = c(0, 0, 20, 20, 40, 40, 50, 0, 0, 20, 20, 40, 40, 50))

你能帮我连接关节吗?

1 个答案:

答案 0 :(得分:1)

使用segments3d功能绘制线段。这需要平常 xyz坐标,并加入点对。因此,您需要确定哪些关节已连接,并绘制这些关节之间的线段。 如果关节总是按照你给出的顺序,它将是这样的:

segs <- c(1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 7)
segments3d(df[segs, 3:5])

(这只是system A段。)

编辑添加:回应第一条评论:你需要告诉R脚踝连接到膝盖等,但你可以这样做。例如:

segs <- c()
for (s in unique(df$system)) {
  seg <- with(df, c(which(system == s & Joint == "LA"),
                    which(system == s & Joint == "LK"))
  if (length(seg) == 2)
    segs <- c(segs, seg)
  seg <- with(df, c(which(system == s & Joint == "LK"),
                    which(system == s & Joint == "CG"))
  if (length(seg) == 2)
    segs <- c(segs, seg)

  # etc for the other side
}
segments3d(df[segs, 3:5])

如果您以某种方式将连接排列在R对象中,则可以将其全部压缩。我会把它交给你解决。