[英]Using R: how to animate multiple 3D objects in single rgl canvas?
我有参与者每手都有位置数据的数据:
左右:
位置数据有
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
使用par3d
进行移动, par3d
移动对象本身。
rgl
没有提供修改场景中已有对象的方法(尽管rgl
对象的WebGL显示确实可以...),因此基本思想如下:
ids <- shade3d(mymesh)
) 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)
}
执行此操作的另一种方法是设置两个单独的子场景。 然后可以通过各自的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])
作为右侧窗格的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.