R rgl - eiichiromomma/CVMLAB GitHub Wiki

(R) rgl

rglのインストール

rglを導入していない場合install.packages関数でインストールしておく。 Unix版の場合は管理者権限でRを起動してから行なう必要がある。

install.packages("rgl")

rglの応用package

ボリュームデータのスライス等が可能。詳細は暇があったら。

視点やズームを再現する方法

par3d

rglで表示したグラフはマウスで視点やズームを変えられ、snapshotが取れるので楽だが、同じ表示を手動で再現しようとすると骨が折れる。

par3d()で必要な情報が得られるが、par3dのhelpにあるように

pv<-par3d()
par3d(pv)

とするとReadOnlyな情報が上書き出来ないと怒られる。

手順

rglでの設定を保存

rglで表示を弄くった後

pv<-par3d()

とすればpvに格納される。 ファイルに保存する場合は

save(pv, file="pv.txt", ascii=T)

とでもして、

load("pv.txt")

とすれば後から呼べる。

表示の再現

rglで何かしらプロットした後

par3d(windowRect=pv$windowRect)  #rglのWindowの表示位置、大きさの再現
par3d(zoom=pv$zoom) #ズームの再現
par3d(userMatrix=pv$userMatrix)   #視点およびその他の再現

とする。

他にも色々あるがpar3dのhelp参照

色ベクトル

RGBそれぞれを軸とする3次元空間への色ベクトルのプロットをrglを用いて行なう

色ベクトルのプロット関数

簡単に作れる。 これを使う前にrimageとrglをロードしておく必要がある。

library(rimage)
library(rgl)

関数にはlist形式の画像ファイル一覧を渡す。

filelist <- list( "ファイル1", "ファイル2", "ファイル3")
myplot3d.files(filelist)

以下関数

    myplot3d.files <- function(filenameList,debug=FALSE){
      imgnumber <- length(filenameList)
      imglist <- as.list(NULL)
      for (imgcount in 1:imgnumber){
        img <- read.jpeg(filenameList[imgcount](/eiichiromomma/CVMLAB/wiki/imgcount))
        imglist <- append(imglist,list(img))
      }
      colorlist <- rainbow(imgnumber)
      ##rglの初期化。関数化したほうが良い
      rgl.clear()
      rgl.bbox(color="#AAAAFF")
      rgl.bg(color=c("grey","black"))
      lines3d(c(0,1.5),c(0,0),c(0,0),color="black")
      lines3d(c(0,0),c(0,1.5),c(0,0),color="black")
      lines3d(c(0,0),c(0,0),c(0,1.5),color="black")
      text3d(0.6,0.01,0,"Red",color="pink")
      text3d(0.01,0.6,0,"Green",color="pink")
      text3d(0,0.01,0.6,"Blue",color="pink")
      text3d(0.5,0,0,"0.5",color="red")
      text3d(0,0.5,0,"0.5",color="green")
      text3d(0,0,0.5,"0.5",color="blue")
      text3d(1,0,0,"1.0",color="red")
      text3d(0,1,0,"1.0",color="green")
      text3d(0,0,1,"1.0",color="blue")
      ##プロット
      for (count in 1:imgnumber){
        r <- as.vector(imglist[count](/eiichiromomma/CVMLAB/wiki/count)[,,1])
        g <- as.vector(imglist[count](/eiichiromomma/CVMLAB/wiki/count)[,,2])
        b <- as.vector(imglist[count](/eiichiromomma/CVMLAB/wiki/count)[,,3])
        if (debug == TRUE){
          points3d(r,g,b,
                   color=colorlist[count])
        } else {
          ##プロットが多いと処理が重くなるので1/10に間引く
          samples <- sample(length(r)[1],(length(r)[1])/10)
          spheres3d(r[samples],
                    g[samples],
                    b[samples],
                    radius=0.008,color=colorlist[count])
        }
      }
      ##凡例
      y <- seq(0,0.8,length=imgnumber)
      for (count in 1:imgnumber){
        spheres3d(0,y[count],0.8,radius=0.008,colorlist[count])
        title <- strsplit(filenameList[count](/eiichiromomma/CVMLAB/wiki/count),"/")
        text3d(0,y[count],0.75,
               title[[1])length(title[[1 )],
               color="pink")
      }
    }

実行例