2017-10-28 8 views
1

私は参加者がそれぞれの手の位置データを持っていたデータを持っている:Rを使う:単一のrglキャンバスで複数の3Dオブジェクトをアニメーション化する方法は?

左: 右:

位置データが最初の質問だったいくつかの時間t

pos.x 
pos.y 
pos.z 

を持っています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

私は基本的なグラフ作成、更新、紡糸認識しています:私の目標は同じRGLのキャンバスに複数のオブジェクトをプロットすることである

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

例えば、

righthand = mymesh 
lefthand = mymesh 

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

各要素は、各要素の位置/時間データに基づいて、時間をかけてアニメーションとして独立して移動有します。今のところ頭は静止していますが、手のひらを表す位置で硬いアイデアに基づいて各手が動きます。

アニメーションが実行されている間にマウスドラッグが(マウスの手や頭の周りの3Dビューを変更するために)発生する可能性があります。

答えて

0

シーン内のオブジェクトを移動するには、rotate3dのような機能を使用します。その名前にもかかわらず、それはかなり一般的な種類の動きを可能にします:ヘルプページを見てください。

par3dを使用して移動する代わりに、オブジェクト自体を移動します。

  • プロット:(rglオブジェクトのWebGLの表示がないのに...)基本的な考え方は以下の通りですので

    rglは、シーンに既に存在するオブジェクトを変更する方法はありません。オブジェクト、およびループ内で、次に(例えばids <- shade3d(mymesh)

  • をIDを保存します。
    • は(par3d(skipRedraw=TRUE)を使用して)アップデート
    • は、オブジェクトを削除をオフにします(たとえば、rgl.pop(id=ids)
    • オブジェクトを移動して置き換えます。
    • 更新をオンにします。

play3d機能はこれを自動化するためのフレームワークを提供していますが、あなたはそれを使用する必要はありません。例えば、これは、二つの二十面体をプロットし、ランダムに独立して、それらを回転させる:

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

これを実行する別の方法は、2つの別々のsubscenesを設定することです。各 は、それ自身のpar3d()設定で制御できます。例えば、

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

ここで、各icosahedraはマウスで独立して操作することができます。 par3dとしたい場合は、par3d(..., subscene = ids[1])のようなものを左ペインに、par3d(..., subscene = ids[2])を右ペインに使用してください。

関連する問題