1

我有一组 3D 坐标(下面 - 仅针对 3D 空间中的一个点):

x <- c(-521.531433, -521.511658, -521.515259, -521.518127, -521.563416, -521.558044, -521.571228, -521.607178, -521.631165, -521.659973)
y <- c(154.499557, 154.479568, 154.438705, 154.398682, 154.580688, 154.365189, 154.3564, 154.559189, 154.341309, 154.344223)
z <- c(864.379272, 864.354675, 864.365479, 864.363831, 864.495667, 864.35498, 864.358582, 864.50415, 864.35553, 864.359863)
xyz <- data.frame(x,y,z)

我需要使用 3D 渲染制作该点的时间序列图(这样我可以旋转图等)。该图将在时间上可视化上述点的轨迹(例如以实线的形式)。我使用带有plot3d方法的 'rgl' 包,但我无法绘制时间序列(下面,仅从时间序列中的第一帧绘制一个点):

require(rgl)    
plot3d(xyz[1,1],xyz[1,2],xyz[1,3],axes=F,xlab="",ylab="",zlab="") 

我找到了这篇文章,但它并没有真正处理实时渲染的 3D 绘图。我将不胜感激任何建议。谢谢你。

4

3 回答 3

3

如果您阅读help(plot3d),您可以看到如何画线:

require(rgl)    
plot3d(xyz$x,xyz$y,xyz$z,type="l")

那是你要的吗?

于 2011-11-16T14:16:10.310 回答
3

这个怎么样?它用于rgl.pop()删除点和线并将它们绘制为轨迹 - 更改 sleep 参数以控制速度:

ts <- function(xyz,sleep=0.3){
  plot3d(xyz,type="n")
  n = nrow(xyz)
  p = points3d(xyz[1,])
  l = lines3d(xyz[1,])
  for(i in 2:n){
    Sys.sleep(sleep)
    rgl.pop("shapes",p)
    rgl.pop("shapes",l)
    p=points3d(xyz[i,])
    l=lines3d(xyz[1:i,])
  }
}
于 2011-11-16T14:42:04.947 回答
2

解决方案比我想象的要简单,问题是我没有as.matrix在我的数据上使用。(list) object cannot be coerced to type 'double'当我只是尝试使用plot3d(在此处找到解决方案)绘制整个数据集时,我遇到了错误。因此,如果您需要绘制坐标集的时间序列(在我的情况下是两个演员的动作捕捉数据),这是我的完整解决方案(仅适用于下面的数据集!):

  • 下载示例数据集
  • 将上述数据读入表格:

    data <- read.table("Bob12.txt",sep="\t")
    
  • 将 XYZ 坐标提取到单独的矩阵中:

    x <- as.matrix(subset(data,select=seq(1,88,3)))
    y <- as.matrix(subset(data,select=seq(2,89,3)))
    z <- as.matrix(subset(data,select=seq(3,90,3)))
    
  • 使用'rgl' 包在漂亮的 3D 渲染图上绘制坐标:

    require(rgl)
    plot3d(x[1:nrow(x),],y[1:nrow(y),],z[1:nrow(z),],axes=F,xlab="",ylab="",zlab="")
    

你应该得到类似下图的东西(但你可以旋转它等)——希望你能认识到那里有供人们使用的联合中心。我仍然需要对其进行调整以使其视觉效果更好 - 将第一帧作为一个点(以清楚地看到演员的关节),然后是可见的中断,然后将其余帧作为一条线。

从上述数据输出上述代码

于 2011-11-17T18:41:56.783 回答