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