2011-11-16 101 views
1

我有一組三維座標(以下 - 只爲一個單一的點,在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' packageplot3d的方法,但我不能讓它繪製時間序列(下面,只畫出從第一幀時間系列單點):

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

我發現this post,但它不真的不需要處理實時渲染的3D地塊。我將不勝感激任何建議。謝謝。

+1

有你的'rgl'包看了一下'?movie3d'?我不太清楚「實時」是什麼意思 - 你的意思是幀速率應該與收集數據的速率完全一致(即,軌跡在1秒內真正收集的點之間前進1秒除此之外),還是僅僅希望顯示電影時間與數據收集時間成比例的數據的電影/動畫(但不一定與其相同)? –

+0

謝謝Ben,'實時'這個詞有點混亂,所以我把它從我的問題中刪除了。我的意思是說,我想要渲染3D圖,以便旋轉它等等,而不是我需要播放任何序列。對困惑感到抱歉。 –

回答

2

的解決方案是簡單的比我想象的,問題是,我沒有使用as.matrix對我的數據。當我僅僅想使用plot3d(找到這個here的解決方案)繪製我的整個數據集時,我得到了錯誤(list) object cannot be coerced to type 'double'。所以,如果你需要繪製時間序列座標集(在兩個演員的我來說,動作捕捉數據),這裏是我的完整解決方案(僅適用於以下數據集!):

  • download example data set
  • 閱讀上述數據到一個表:

    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' package上一個不錯的,3D渲染的情節座標:

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

你應該得到類似下面的圖片(但你可以將其旋轉等) - 希望你能認識到有聯合中心爲那裏的人。我仍然需要調整它,使其看起來更好 - 以第一幀作爲點(清楚地看到演員的關節),然後是可見的中斷,然後將其餘的幀作爲線條。

Output of the above code from the above data

2

如果你讀help(plot3d)你可以看到如何畫線:

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

這是你想要的嗎?

+0

我知道這個選項,但那不是我要找的。這個想法是'xyz'中的每一行定義了一個時間步,x,y,z列定義了特定時間步的點的位置。所以我需要第一步成爲一個觀點,並且所有其他步驟都要形成一條線,以顯示此時間點的位置。 –

+0

是不是通過type =「l」繪製的線顯示了時間點的位置?你真的想要一個移動點嗎? – Spacedman

+0

好的,問題是它似乎不適用於大型數據集,例如動作捕捉數據。我上傳了示例[這裏](http://motioninsocial.com/files/Bob12.txt)。這是來自兩位演員的動作捕捉數據。單個座標由三列(總共90列,單個演員45個,每個演員15個點)編碼。我將xyz提取到單獨的框架中,但我無法使用type =「l」或您發佈的「ts」函數繪製3D時間序列。 –

3

這個怎麼樣?它採用rgl.pop()刪除點和線,並吸引他們的蹤跡 - 改變睡眠參數來控制速度:

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,]) 
    } 
}