rgl segments3d 连接 3d 散点以绘制骨架

rgl segments3d to connect 3d scatter points in order to plot a skeleton

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

我已经设法绘制并标记了关节,但我不知道如何用线连接关节。

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

简化数据集:

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

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

library(rgl)
with(df, plot3d(x, y, z, type="s", col = as.numeric(system)))
with(df, text3d(x, y, z, text = Joint, adj = 2))

你能帮我连接关节吗?

使用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 对象中,则可以全部压缩。我会把它留给你解决。