2017-10-28 4 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 데이터 객체를 표시하고 애니메이션화 할 수 있도록하려면 데이터.

즉, 손목 시계 영역이 적절하게 움직이는 강체와 같이 손을 다루십시오. 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 캔버스에 여러 개체를 음모하는 것입니다

은 내가 hand.OBJ 파일을 온라인으로 배치했다.

예컨대,

righthand = mymesh 
lefthand = mymesh 

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

각 요소는 각 요소의 위치/시간 데이터에 기초하여 시간이 지남에 따라 애니메이션으로 독립적으로 이동할 수있다. 지금은 머리가 움직이지는 않지만 손목을 나타내는 자세로 각 손이 움직입니다.

애니메이션이 진행되는 동안 마우스 끌기가 여전히 (손과 머리 주위의 3D보기를 변경하기 위해) 발생할 수있는 보너스입니다.

답변

0

rotate3d과 같은 기능을 사용하여 장면 내의 개체를 이동할 수 있습니다. 그 이름에도 불구하고 아주 일반적인 종류의 움직임을 허용합니다 : 도움말 페이지를보십시오.

par3d을 사용하여 이동하는 대신 오브젝트 자체를 이동하십시오.

rgl은 (rgl 객체가 WebGL 디스플레이가 ... 않습니다하지만) 장면에 이미있는 개체를 수정하는 방법을 제공하지 않기 때문에, 기본적인 아이디어는 다음과 다음

  • 플롯 객체 및 루프, 그리고 (예 : ids <- shade3d(mymesh))
  • 을 ID를 저장합니다
    • 이 (par3d(skipRedraw=TRUE) 사용) 업데이트
    • 개체를 삭제를 끄십시오 (예 :rgl.pop(id=ids))
    • 개체 이동 및 바꾸기
    • 업데이트를 켜십시오.

play3d 기능이 자동화 할 수있는 프레임 워크를 제공하지만, 당신은 그것을 사용할 필요가 없습니다. 예를 들어,이 두 icosahedra을 나타내는 무작위로 독립적으로 회전 :

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

이 작업을 수행하는 또 다른 방법은 두 개의 별도 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])을 사용하십시오.

관련 문제