我有一组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渲染制作这个点的时间序列图(所以我可以旋转图等)。该图将可视化上述时间点的轨迹(例如以实线的形式)。我使用'rgl' package方法plot3d,但我无法绘制时间序列(下面,只是绘制时间序列中第一帧的单点):
require(rgl)
plot3d(xyz[1,1],xyz[1,2],xyz[1,3],axes=F,xlab="",ylab="",zlab="")
我找到了this post,但它并没有真正处理实时渲染的3D图。我将不胜感激任何建议。谢谢。
答案 0 :(得分: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,])
}
}
答案 1 :(得分:2)
如果您阅读help(plot3d)
,则可以看到如何绘制线条:
require(rgl)
plot3d(xyz$x,xyz$y,xyz$z,type="l")
这就是你想要的吗?
答案 2 :(得分:2)
解决方案比我想象的简单,问题是我没有对我的数据使用as.matrix
。当我只是尝试使用(list) object cannot be coerced to type 'double'
绘制整个数据集时,我收到了错误plot3d
(找到了此here的解决方案)。所以,如果你需要绘制坐标集的时间序列(在我的情况下是两个演员的动作捕捉数据),这里是我的完整解决方案(仅适用于下面的数据集!):
将上述数据读入表格中:
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)))
require(rgl)
plot3d(x[1:nrow(x),],y[1:nrow(y),],z[1:nrow(z),],axes=F,xlab="",ylab="",zlab="")
你应该在下面的图片上得到类似的东西(但你可以旋转它等) - 希望你能认识到那里的人们有联合中心。我仍然需要调整它以使其在视觉上更好 - 将第一帧作为一个点(以清楚地看到actor的关节),然后是一个可见的中断,然后将其余的帧作为一条线。