使用R:如何在单个rgl画布中动画多个3D对象?

使用R:如何在单个rgl画布中动画多个3D对象?

问题描述:

我在那里参加了每手的位置数据的数据:使用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视图)将是一项额外奖励。

您可以使用像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])