繁体   English   中英

使用R:如何在单个RGB画布中设置多个3D对象的动画?

[英]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显示确实可以...),因此基本思想如下:

  • 绘制对象并保存ID(例如, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM