使用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])
。