Сделать 3D-рендеринг сюжета временного ряда - PullRequest
1 голос
/ 16 ноября 2011

У меня есть набор трехмерных координат (ниже - только для одной точки в трехмерном пространстве):

x <- c(-521.531433, -521.511658, -521.515259, -521.518127, -521.563416, -521.558044, -521.571228, -521.607178, -521.631165, -521.659973)
y <- c(154.499557, 154.479568, 154.438705, 154.398682, 154.580688, 154.365189, 154.3564, 154.559189, 154.341309, 154.344223)
z <- c(864.379272, 864.354675, 864.365479, 864.363831, 864.495667, 864.35498, 864.358582, 864.50415, 864.35553, 864.359863)
xyz <- data.frame(x,y,z)

Мне нужно сделать график временных точек этой точки с помощью 3D-рендеринга (чтобы я мог вращать график и т. Д.). График визуализирует траекторию указанной выше точки во времени (например, в виде сплошной линии). Я использовал пакет 'rgl' с методом plot3d , но я не могу сделать это для построения временных рядов (ниже, просто нанесите одну точку из первого кадра во временных рядах) :

require(rgl)    
plot3d(xyz[1,1],xyz[1,2],xyz[1,3],axes=F,xlab="",ylab="",zlab="") 

Я нашел этот пост , но на самом деле он не имеет отношения к 3D-графикам в реальном времени. Буду признателен за любые предложения. Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Как насчет этого? Он использует rgl.pop(), чтобы удалить точку и линию и нарисовать их как след - измените аргумент сна, чтобы контролировать скорость:

ts <- function(xyz,sleep=0.3){
  plot3d(xyz,type="n")
  n = nrow(xyz)
  p = points3d(xyz[1,])
  l = lines3d(xyz[1,])
  for(i in 2:n){
    Sys.sleep(sleep)
    rgl.pop("shapes",p)
    rgl.pop("shapes",l)
    p=points3d(xyz[i,])
    l=lines3d(xyz[1:i,])
  }
}
2 голосов
/ 17 ноября 2011

Решение оказалось проще, чем я думал, и проблема заключалась в том, что я не использовал as.matrix в своих данных. Я получал ошибку (list) object cannot be coerced to type 'double', когда я просто пытался построить весь свой набор данных, используя plot3d (нашел решение для этого здесь ). Итак, если вам нужно построить временные ряды набора координат (в моем случае данные захвата движения двух актеров), вот мое полное решение (работает только с набором данных ниже!):

  • скачать пример набора данных
  • читать приведенные выше данные в таблицу:

    data <- read.table("Bob12.txt",sep="\t")
    
  • извлечение координат XYZ в отдельные матрицы:

    x <- as.matrix(subset(data,select=seq(1,88,3)))
    y <- as.matrix(subset(data,select=seq(2,89,3)))
    z <- as.matrix(subset(data,select=seq(3,90,3)))
    
  • нанесите координаты на хороший 3D-рендеринг, используя пакет 'rgl' :

    require(rgl)
    plot3d(x[1:nrow(x),],y[1:nrow(y),],z[1:nrow(z),],axes=F,xlab="",ylab="",zlab="")
    

Вы должны получить что-то похожее на изображение ниже (но вы можете повернуть его и т. Д.) - надеюсь, вы сможете распознать, что там есть совместные центры для людей. Мне все еще нужно настроить его визуально лучше - сначала создать кадр в виде точек (чтобы четко видеть суставы актера), затем видимый разрыв, а затем остальные кадры в виде линий.

Output of the above code from the above data

2 голосов
/ 16 ноября 2011

Если вы прочитаете help(plot3d), вы увидите, как рисовать линии:

require(rgl)    
plot3d(xyz$x,xyz$y,xyz$z,type="l")

Это то, что вы хотите?

...