2017-10-28 132 views
1

我在那裏參加了每手的位置數據的數據:使用R:如何在單個rgl畫布中動畫多個3D對象?

左: 右:

位置數據具有

pos.x 
pos.y 
pos.z 

在一段時間t

最初的問題是關於導入OBJ以使用RGL:https://stackoverflow.com/posts/46626767/revisions

我已經想出了這一部分。我編寫了一些功能來改進開源OBJ文件的rgl網格框架。

我把所需要的功能在線:https://gist.github.com/MonteShaffer/d142210cddf346c86aeab1ea2d1d7e9d

位置數據應該在手腕上的手錶被捕獲,所以我想各自獨立地基於位置/時間才能夠顯示出兩個以上的3D數據對象和動畫數據。

也就是說,在手錶區域適當移動的情況下,將手像剛體一樣對待。

我把hand.OBJ文件在線:https://gist.github.com/MonteShaffer/6c0057b1431364caf120220db77dde4b

我知道基本的圖形,更新,紡:

library(rgl) 

mymesh = buildBasicMeshFromOBJ(parseFileOBJ("hand.OBJ")); 

open3d() 
shade3d(mymesh, col = "pink") 
par3d(userMatrix = rotate3d(par3d("userMatrix"), 0.1, 1,0,0)) 
play3d(spin3d(axis = c(1, 0, 0))) 

我的目標是繪製同一RGL畫布上的多個對象。

例如,

righthand = mymesh 
lefthand = mymesh 

head = buildBasicMeshFromOBJ(parseFileOBJ("head.obj")); 

,並具有每個元素作爲動畫基於對用於每個元件的位置/時間數據的時間獨立地移動。現在頭部保持不動,但每隻手都根據僵硬的想法和代表手腕的位置移動。

在動畫播放過程中,鼠標拖動仍然可能發生(改變手和頭部周圍的3D視圖)將是一項額外獎勵。

回答

0

您可以使用像rotate3d這樣的功能在場景中移動物體。儘管它的名字,它允許相當普遍的運動類型:請參閱幫助頁面。

因此,而不是使用par3d移動的東西,移動對象本身。

rgl不提供一種方法來修改已經在現場(雖然rgl對象的WebGL的顯示器呢?)對象,因此其基本思想是:

  • 情節對象,並保存的ID(例如ids <- shade3d(mymesh)
  • 然後,在循環:
    • 關閉更新(使用par3d(skipRedraw=TRUE)
    • 刪除的對象(例如rgl.pop(id=ids)
    • 移動並重新繪製對象
    • 打開更新。

play3d功能提供了一個框架來自動完成這個,但你並不需要使用它。例如,該地塊2個二十面體和隨機獨立旋轉他們:

orig1 <- icosahedron3d() 
id1 <- shade3d(orig1, col = "green") 
orig2 <- translate3d(orig1, 4, 0, 0) 
id2 <- shade3d(orig2, col = "blue") 

repeat { 
    orig1 <- rotate3d(orig1, 0.01, rnorm(1, 1), rnorm(1), rnorm(1)) 
    orig2 <- rotate3d(orig2, 0.05, rnorm(1, -1), rnorm(1), rnorm(1)) 
    par3d(skipRedraw = TRUE) 
    rgl.pop(id = c(id1, id2)) 
    id1 <- shade3d(orig1, col = "green") 
    id2 <- shade3d(orig2, col = "blue") 
    par3d(skipRedraw = FALSE) 
} 

另一種方式來做到這一點是建立兩個獨立的子場景。然後每個 可以通過它自己的par3d()設置進行控制。例如,

icos <- icosahedron3d() 
ids <- mfrow3d(1,2) 
shade3d(icos, col = "red") 
next3d() 
shade3d(icos, col = "green") 

現在每個二十面體可以用鼠標獨立操縱。如果要使用par3d來執行此操作,請使用類似par3d(..., subscene = ids[1])的內容來影響左側窗格,右側窗格爲par3d(..., subscene = ids[2])