訳注: 訳については仮訳です。リンクは機能していません。日本語環境はほとんど未検証です。
rgl
パッケージは、インタラクティブな3次元プロットを作成するために使用します。 従来のRのグラフィックを緩やかにモデル化した高レベルのグラフィックコマンドが含まれていますが、3次元で動作します。 また、grid
パッケージにインスパイアされた(しかし、互換性のない)低レベルの構造も含まれています。
このドキュメントでは,その概要を説明します。 詳細はヘルプページを参照してください。
インストール方法については、ソースtarボールのトップレベルディレクトリにある rgl_0.106.8.tar.gz(またはそれ以降のバージョン)の README
ファイルを参照してください。
このドキュメントは R Markdown で書かれており、制作には knitr
パッケージを使用しています。 rgl
のバージョン 0.106.8 に対応しています。
ハイライトされた関数名のほとんどは HTML リンクです。 内部リンクはどのブラウザでも動作します。 ヘルプトピックへのリンクは、R のヘルプシステムから vignette を表示した場合に動作します。
このドキュメントには WebGL の図が含まれています。 これらを表示するには、ブラウザで Javascript と WebGL を有効にする必要があります。 一部の古いブラウザではサポートされていないかもしれません。テストと議論へのリンクは https://get.webgl.org をご覧ください。
plot3d
関数は、RGL ウィンドウ内のポイントをプロットします。 これは古典的な plot
関数と似ていますが、3次元で動作します。
以下にその例を示します。
iris$花弁.長さ <- iris$Petal.Length
with(iris, plot3d(Sepal.Length, Sepal.Width, 花弁.長さ,
type="s", col=as.numeric(Species)))
(訳注: 日本語環境テスト中)
これはiris
データの3列をプロットするために使用することができます。 許可されているプロットタイプは "p", "l", "h", "s"
で、それぞれ点、線、z = 0 からのセグメント、球を意味します。 座標の指定には多くの柔軟性があります。 これには grDevices
パッケージの xyz.coords
関数を使用します。
マウスを使ってプロットを操作することができます。 デフォルトでは、マウスの左ボタンでクリックしたままにすると、プロットをドラッグして回転させることができます。 マウスの右ボタンで大きさを変え、真ん中のボタンで視点を変えることができます。
再度 plot3d
を呼び出すと、現在のプロットが上書きされます。 新しいグラフィックウィンドウを開くには、open3d
を使います。
もうひとつの高レベル関数は、サーフェイスを描画するための persp3d
です。 これは、古典的な persp
関数に似ていますが、より柔軟性があります。 まず、x
, y
, z
のいずれかを z
だけでなく、行列を使って指定することができます。 これにより,パラメトリックな曲面をプロッティングすることができます。 さらにシンプルな指定も可能で、x
は関数でもよく、その場合は persp3d
がグリッド自体を計算します。 詳細は ?persp3d.function を参照してください。 例えば、MASS
パッケージでは、?MASS::fitdistr の例で、最尤法を用いてガンマパラメータを推定しています。 ここでは、対数尤度曲面を示しています。
library(MASS)
# from the fitdistr example
set.seed(123)
x <- rgamma(100, shape = 5, rate = 0.1)
fit <- fitdistr(x, dgamma, list(shape = 1, rate = 0.1), lower = 0.001)
loglik <- function(shape, rate) sum(dgamma(x, shape=shape, rate=rate,
log=TRUE))
loglik <- Vectorize(loglik)
xlim <- fit$estimate[1]+4*fit$sd[1]*c(-1,1)
ylim <- fit$estimate[2]+4*fit$sd[2]*c(-1,1)
mfrow3d(1, 2, sharedMouse = TRUE)
persp3d(loglik,
xlim = xlim, ylim = ylim,
xlab="形",
n = 30)
zlim <- fit$loglik + c(-qchisq(0.99, 2)/2, 0)
next3d()
persp3d(loglik,
xlim = xlim, ylim = ylim, zlim = zlim,
n = 30)
左はパラメータの範囲内での曲面全体、右は対数尤度の値が最大に近い曲面の部分のみ。
注意:この例では,シーンをこのヴィネットに挿入するために、knitr
フック関数(setupKnitr
を参照)を使用しています。 前の例では、rglwidget
関数を使いました。 一般的には、より新しい rglwidget
のアプローチをお勧めします。
なお、plot3d
と persp3d
はどちらもジェネリック関数で、以下のメソッドが定義されています。
## [1] plot3d.ashape3d* plot3d.default* plot3d.deldir*
## [4] plot3d.formula* plot3d.function* plot3d.lm*
## [7] plot3d.mesh3d* plot3d.rglbackground* plot3d.rglbboxdeco*
## [10] plot3d.rglobject* plot3d.rglscene* plot3d.rglsubscene*
## [13] plot3d.rglWebGL* plot3d.tri* plot3d.triSht*
## see '?methods' for accessing help and source code
## [1] persp3d.ashape3d* persp3d.default* persp3d.deldir* persp3d.formula*
## [5] persp3d.function* persp3d.tri* persp3d.triSht*
## see '?methods' for accessing help and source code
古典的なグラフィックスに points
や lines
があるように、rgl
には現在のアクティブなプロットにグラフィカルな要素を追加するための低レベルの関数がいくつかあります。 primitive な図形とは、OpenGLにネイティブなものです。
Function | Description |
---|---|
points3d : |
点を追加 |
lines3d : |
線を追加 |
segments3d : |
線分を追加 |
triangles3d : |
三角形を追加 |
quads3d : |
四辺形を追加 |
上記の各関数は引数 x
, y
, z
を取りますが、ここでも xyz.coords
を使って柔軟に対応しています。 また、必要に応じて連続したエントリーをグループ化します。 例えば、triangles3d
関数は、連続した3つの点を三角形の頂点として受け取ります。
これらの関数を使って、現在のグラフに注釈を付けたり、ゼロから図形を作成したりすることができます。
rgl
にはプリミティブから構築するオブジェクトもいくつかあります。
Function | Description |
---|---|
text3d , texts3d : |
テキストを追加 |
abclines3d : |
直線を plot に追加 (abline のように) |
arc3d : |
plot に球形の円弧や螺旋を追加 |
planes3d : |
plot に平面を追加 |
clipplanes3d : |
plot にクリップ平面を追加 |
sprites3d , particles3d : |
plot にスプライト(固定された図形やイメージ)を追加 |
spheres3d : |
球体の追加 |
surface3d , terrain3d : |
表面 (persp3d で使用) |
drape3d : |
表面や物体に線を描く |
shadow3d : |
メッシュを表面に投影 |
arrow3d : |
シーンに矢印を加える |
pch3d : |
ベーススタイルのプロットシンボルの描画 |
plotmath3d : |
text3d で使用される数式のテキスト |
以下の低レベル関数は、グラフの外観を制御します。:
Function | Description |
---|---|
axes3d , axis3d : |
plot に軸を追加 |
box3d , bbox3d : |
plot の周囲にボックスを追加 |
title3d : |
plot にタイトルを追加 |
mtext3d : |
plot に欄外のテキストを追加 |
decorate3d : |
plot に複数の「装飾」(縮尺など)を追加 |
aspect3d : |
plot のアスペクト比を設定 |
bg3d , bgplot3d : |
シーンの背景を設定 |
show2d : |
3D シーンに 2d plot または画像を表示 |
legend3d : |
シーンの凡例を作る |
grid3d : |
グラフへの参照グリッドを追加 |
thigmophobe3d : |
オーバーラップしないようにラベルの位置を選ぶ |
例えば、3つのランダムな三角形をプロットするには、次のようにします。
triangles3d(cbind(x=rnorm(9), y=rnorm(9), z=rnorm(9)), col = "green")
decorate3d()
bg3d("lightgray")
上記の *3d
関数の他に、さらに低レベルの関数として
があります。
これらの関数は、上位の *3d
関数とうまく連携できないので、使用しないようにしてください。 詳しくは ?r3d のヘルプトピックを参照してください。
ほとんどのシーンでは、オブジェクトは「照明」されています。つまり、オブジェクトの見た目は、シーン内のライトとの相対的な位置や方向に依存します。 通常、ライト自体は表示されませんが、オブジェクトへの影響は表示されます。
照明の位置と特性を指定するには、light3d
関数を使用します。 照明は無限に遠くにある場合もあれば、シーンの中に埋め込まれている場合もあります。 照明の特性には、ambient
、diffuse
、specular
の各成分があり、すべてのデフォルトは白です。 デフォルトでは白になります。 ambient
成分は、どの方向から見ても同じように見えます。 diffuse
成分は,表面と光の間の角度に依存し,specular
成分は,見る人の位置も考慮します.
rgl
で使用されるメンタルモデルは、シーンで表示されているオブジェクトは、空間上の物理的なオブジェクトであり、光がどのように反射するか(または光がどのように照射されるか)に影響を与える材料特性を持っているというものです。 これらは主に material3d
関数や、それに渡される他の関数の引数によって制御されます。
material3d
の呼び出しで設定できるマテリアルのプロパティについては、?material3d のヘルプページで詳しく説明されています。 ここではその概要を説明します。
Property | Default | Meaning |
---|---|---|
color | white | 拡散光のために連続した頂点に適用される表面色のベクトル |
alpha | 1 | 透明度: 0 は不可視, 1 は透明 |
lit | TRUE | 照明の計算が必要かどうか |
ambient | black | 環境光での色 |
specular | white | 鏡面仕上げの色 |
emission | black | 表面から発せられる色 |
shininess | 50 | 鏡面照明をコントロール:高い値ほど光沢があるように見える |
smooth | TRUE | シェーディングを頂点間で補間するかどうか |
texture | NULL | サーフェスに表示される「テクスチャ」ビットマップへの任意のパス |
front, back | fill | ポリゴンは塗りつぶすか、輪郭を描くか? |
size | 3 | ピクセル単位でのポイントの大きさ |
lwd | 1 | ピクセル単位での線幅 |
その他のプロパティとしては、“texmipmap”, “texmagfilter”, “texminfilter”, “texenvmap”, “fog”, “point_antialias”, “line_antialias”, “depth_mask”, “depth_test”, “polygon_offset”などがあります。 詳細は the help page を参照してください。
前節で説明したように、マテリアルのプロパティの一つに「テクスチャ」があります。これは、サーフェイスに表示する画像を含むビットマップファイル(.png
形式)の名前です。 テクスチャの詳細については、このセクションを参照してください。
OpenGL
では、ポリゴンの各頂点はビットマップ内の特定の位置に関連付けることができます。 ポリゴンの内部はビットマップ内で補間されます。 これらの座標を指定するために、rgl
の関数には2つの規則があります。
プリミティブを指定する関数 (triangles3d
など) は,オプションの行列引数 texcoords
を受け取ります。 これは、ビットマップ内の s
(水平方向) と t
(垂直方向) の位置を、頂点ごとに1行の列で指定します。 座標は、左下が (0,0)
で、右上が (1,1)
です。 例えば、(1.1, 1.1)
は、(0.1, 0.1)
と同じ点を指定することになります。
surface3d
のように、各頂点座標の行列を受け取る他の関数は、引数 texture_s
と texture_t
で、テクスチャ座標も行列として受け取ります。
例えば、以下のコードでは、2Dプロットの4つのコピーを四角形に表示しています。
filename <- tempfile(fileext = ".png")
png(filename = filename)
plot(rnorm(1000), rnorm(1000))
dev.off()
## quartz_off_screen
## 2
## null
## 9
rgl
では、テキストの描画にベースグラフィックスと同じ考え方を採用しており、"sans"
, "serif"
, "mono"
というフォントファミリーがあり、これらの種類のテキストを描画します。 rgl
では、"symbol"
のフォントファミリーはサポートされていません。
新しいフォントファミリーは、低レベルの関数 rglFonts
を使って定義することができます。 より簡単には、高レベルの関数 rglExtrafonts
を使って定義します。 後者の関数を使用するには、extrafont
パッケージがインストールされている必要があります。
par3d
関数は、古典的なグラフィックスの par
関数を模したもので、さまざまな rgl
内部パラメータを設定したり、読み出したりします。 完全に読み取り専用のパラメータもあれば、ウィンドウが開かれた時点で固定されているもの、いつでも変更可能なものもあります。
Name | Changeable? | Description |
---|---|---|
antialias | fixed | ハードウェア・アンチエイリアスの量 |
cex | Default size for text | |
family | Device-independent font family name; see ?text3d | |
font | Integer font number | |
useFreeType | Should FreeType fonts be used if available? | |
fontname | read-only | System-dependent font name set by rglFonts |
FOV | Field of view, in degrees. Zero means isometric perspective | |
ignoreExtent | Should rgl ignore the size of new objects when computing the bounding box? |
|
skipRedraw | Should rgl suppress updates to the display? |
|
maxClipPlanes | read-only | How many clip planes can be defined? |
modelMatrix | read-only | The OpenGL ModelView matrix; partly set by view3d or the obsolete rgl.viewpoint |
projMatrix | read-only | The OpenGL Projection matrix |
bbox | read-only | Current bounding-box of the scene |
viewport | Dimensions in pixels of the scene within the window | |
windowRect | Dimensions in pixels of the window on the whole screen | |
listeners | Which subscenes respond to mouse actions in the current one | |
mouseMode | What the mouse buttons do. See “mouseMode” |
|
observer | read-only | The position of the observer; set by observer3d |
scale | Rescaling for each coordinate; see aspect3d |
|
zoom | Magnification of the scene |
r3dDefaults
のリストとgetr3dDefaults
の関数は、open3d
で開いた新しいウィンドウのデフォルトを制御します。 この関数は、ユーザのグローバル環境にある変数を探し、見つからなければ rgl
名前空間にある変数を探します。 これにより、ユーザは新しいウィンドウのデフォルト設定をオーバーライドすることができます。
見つかると、r3dDefaults
リストが par3d
パラメータの初期値を提供し、コンポーネント "material"
と "bg"
における material3d
と bg3d
のデフォルト値をそれぞれ提供します。
rgl
には様々な固体の形状を構築し、表示するための関数が含まれています。 これらはクラス "shape3d"
, "mesh3d"
, "shapelist3d"
のオブジェクトを生成します。 それぞれのクラスの詳細は後述します。 まずはそれらを生成するための関数を紹介します。
特定の形状を生成する関数です。 オプションの引数で色や変形などの属性を指定することができます。
Function | Description |
---|---|
tetrahedron3d , cube3d , octahedron3d , dodecahedron3d , icosahedron3d : |
Platonic solids |
cuboctahedron3d , oh3d : |
other solids |
cols <- rainbow(7)
layout3d(matrix(1:16, 4,4), heights=c(1,3,1,3))
text3d(0,0,0,"tetrahedron3d"); next3d()
shade3d(tetrahedron3d(col=cols[1])); next3d()
text3d(0,0,0,"cube3d"); next3d()
shade3d(cube3d(col=cols[2])); next3d()
text3d(0,0,0,"octahedron3d"); next3d()
shade3d(octahedron3d(col=cols[3])); next3d()
text3d(0,0,0,"dodecahedron3d"); next3d()
shade3d(dodecahedron3d(col=cols[4])); next3d()
text3d(0,0,0,"icosahedron3d"); next3d()
shade3d(icosahedron3d(col=cols[5])); next3d()
text3d(0,0,0,"cuboctahedron3d"); next3d()
shade3d(cuboctahedron3d(col=cols[6])); next3d()
text3d(0,0,0,"oh3d"); next3d()
shade3d(oh3d(col=cols[7]))
非常に大きな多面体のコレクションが Rpolyhedra パッケージに含まれています。
これらの関数は新しい形状を生成します。:
Function | Description |
---|---|
cylinder3d : |
筒またはシリンダーを生成 |
polygon3d : |
三角測量法で平面ポリゴンを生成 |
extrude3d : |
ポリゴンの「突起」を生成 |
turn3d : |
回転の立体を生成 |
ellipse3d : |
様々な方法で楕円体を生成 |
mesh3d : |
インデックス付きの頂点から形状を生成 |
shapelist3d : |
他の図形を組み合わせて図形を生成 |
as.mesh3d : |
generic 関数。以下を参照。 |
関連する関数として、triangulate
があります。 これは、2次元の多角形を受け取り、“ear-clipping” アルゴリズムを用いてそれを三角形に分割します。
汎用関数 as.mesh3d
は、他のコードが生成したデータ構造をメッシュ構造に変換するために提供されています。 現在、以下のクラスがサポートされています。:
Class | Package | Description |
---|---|---|
deldir |
deldir |
不規則な点群のドロネー三角法(Delaunay Triangulation)。 |
triSht |
interp |
こちらもドロネー三角法 |
tri |
tripack |
一般ドロネー三角法 |
ashape3d |
alphashape3d |
アルファ形状 |
rglId |
rgl |
rgl object identifier |
デフォルトの as.mesh3d.default
メソッドは、頂点の行列からメッシュを構築するシンプルな方法です。mergeVertices
(単独でも使用可能) を使用して、行列内の繰り返される頂点をマージすることができ、addNormals
を使用して滑らかな外観を得ることができます。
"shape3d"
が基本的な抽象型です。 このクラスのオブジェクトは、 shade3d
(面の影をつける)、 wire3d
(辺を描く)、 dot3d
(各頂点に点を描く)で表示できます。
"mesh3d"
はその子孫型です。 この型のオブジェクトには以下のフィールドがあります。:
Field | Meaning |
---|---|
vb | A 4 by n matrix of vertices in homogeneous coordinates. Each column is a point. |
ip | (optional) A vector of vertex indices for points. |
is | (optional) A 2 by s matrix of vertex indices. Each column is a line segment. |
it | (optional) A 3 by t matrix of vertex indices. Each column is a triangle. |
ib | (optional) A 4 by q matrix of vertex indices. Each column is a quadrilateral. |
material | (optional) A list of material properties. |
normals | (optional) A matrix of the same shape as vb, containing normal vectors at each vertex. |
texcoords | (optional) A 2 by n matrix of texture coordinates corresponding to each vertex. |
values | (optional) A vector of length n holding values at each vertex |
meshColor | (optional) A text value indicating how colors and texture coordinates should be interpreted. |
これらの関数は、曲面上の関数の輪郭を計算してプロットしたり、関数の輪郭に沿ってオブジェクトをクリップしたりします。
Function | Description |
---|---|
contourLines3d : |
draw contour lines on surface |
filledContour3d : |
fill between contours on surface |
clipMesh3d : |
clip mesh object using curved boundary |
clipObj3d : |
clip general object using curved boundary |
これらの関数は、メッシュオブジェクトを操作、修正します。:
Function | Description |
---|---|
addNormals : |
add normal vectors to make a shape look smooth |
subdivision3d : |
add extra vertices to make it look even smoother |
merge : |
merge mesh objects |
facing3d : |
subset of mesh facing “up” |
また、subdivision3d
の個々のステップも利用できます。: r indexfns(c(“deform.mesh3d”, “divide.mesh3d”, “normalize.mesh3d”))`。 これらは主に内部利用を目的としています。
rgl
には、複数の異なる「サブシーン」を同じウィンドウに表示するためのいくつかの機能があります。 主な機能は以下の通りです。
Function | Description |
---|---|
mfrow3d : |
Multiple figures (like par(“mfrow”) |
layout3d : |
Multiple figures (like layout ) |
next3d : |
Move to the next figure (like plot.new or frame ) |
subsceneList : |
List all the subscenes in the current layout |
clearSubsceneList : |
Clear the current list and revert to the previous one |
また、下位の機能もあります。
Function | Description |
---|---|
newSubscene3d : |
Create a new subscene, with fine control over what is inherited from the parent |
currentSubscene3d : |
Report on the active subscene |
subsceneInfo : |
Get information on current subscene |
useSubscene3d : |
Make a different subscene active |
addToSubscene3d , delFromSubscene3d : |
Add objects to a subscene, or delete them |
gc3d : |
Do “garbage collection”: delete objects that are not displayed in any subscene |
rgl
のシーンを含むドキュメントrgl
パッケージは、他のドキュメントに埋め込むことができる出力を作成することができます。 これを行うために推奨される方法は、これまでに何度か変更されてきました。 ここでは、現在推奨されている方法から始めて、古い方法を紹介します。
現在、rgl
シーンをドキュメントに埋め込むための最良の方法は、R Markdownを使ってHTMLでドキュメントを作成することです。 ドキュメントの初期段階では、セットアップコードチャンクの一つに以下のようなコードがあるはずです。:
setupKnitr()を呼び出すと、
rglコードが適切に処理されるように、
knitrにいくつかのフックをインストールしたり、オプションを設定したりします。 autoprint = TRUE
引数は、rgl
がドキュメント内で、コンソールで動作するのとほぼ同じように、あるいは knitr
でベースグラフィックスが処理されるのと同じように動作させます。 高レベルの rgl
関数の値を印刷すると、プロットが出力に挿入されますが、それは低レベルの修正が完了した後になるでしょう。 例えば、このコードブロックは三角形と球体の両方を最後に1つのプロットで表示します。:
xyz <- matrix(rnorm(27), ncol = 3)
triangles3d(xyz, col = rainbow(9))
spheres3d(xyz, col = rainbow(9), radius = 0.1)
複雑な事情がある場合には、いくつかの違いがあります。
rgl
関数の呼び出しの結果が自動的にプリントされるかどうかに依存します。 呼び出しがループやその他のコードブロックの中にあって、自動印刷が行われない場合は、印刷させるために何らかの工夫が必要になります。 例えば、これは3つのプロットを印刷します。:plots <- NULL
for (i in 1:3) {
plot3d(rnorm(10), rnorm(10), rnorm(10))
plots <- htmltools::tagList(plots, rglwidget())
close3d()
}
plots
rgl
関数が lowlevel()
や highlevel()
を使って、どの種類のプロットかを示す結果を返すかどうかにも依存します。 プロットを生成するために他のパッケージの関数を使用している場合には、印刷するためにこれらの関数のいずれかを明示的に呼び出す必要があるかもしれません。 関数が既存のプロットを変更するだけならば、lowlevel()
を使い、新しいプロットを開始するならば、highlevel()
を使います。 例えば、以下のようになります。foreignHigh() # Produces a high level plot, but doesn't return
# an appropriate value
highlevel()
foreignLow() # Modifies the previous plot
lowlevel()
これにより、コードチャンクの最後に、修正が完了したとみなされる出力が表示されます。
PDF プレビューアの中には、インタラクティブな 3D グラフィックをサポートしているものもありますが、ほとんどのものはサポートしていません。 R Markdown ドキュメント内の rgl
シーンのスクリーンショットを PDF 出力で作成するには、上記の指示に従うだけです。 自動印刷はPDF出力を検出し、snapshot3d
を使って挿入用のPNGファイルを作成します。 (他のフォーマットのグラフィックを挿入したい場合は、以下を参照してください。)
どうしてもインタラクティブな出力が必要な場合は、writeASY
関数を参照してください。
前述の setupKnitr(autoprint = TRUE)
メソッドは、あまり使いたくないかもしれません。 これは非常に新しく、まだバグがあるかもしれません。また、古いドキュメントを持っていて、そのように動作するように編集したくない場合もあるでしょう。
このような場合には、手動でプロットを挿入することができます。 U セットアップコードを見る
そして、プロットを挿入したいときはいつでもトップレベルで rglwidget()
を呼び出します。
autoprint` を使用していない場合のデフォルトの動作には、他にもいくつかの違いがあります。
デフォルトでは、各コードチャンクは以前のチャンクの rgl
シーンを継続します。 クリーンなウィンドウを得るためには、明示的に open3d
を呼び出す必要があります。
また、デフォルトでは、チャンクの終了時に rgl
ウィンドウは閉じられません。 これはおそらく問題ではありませんが、シーンが非常に大きい場合にはメモリ不足になる可能性があります。
rgl
のシーンをドキュメントに挿入するオリジナルの方法は、writeWebGL
関数を使って、ドキュメントに挿入する HTML コードを書くことでした。 その後、Sweave
とknitr
のフックが追加されました。 これらはもうメンテナンスされていませんので、古い文書を更新して新しい方法を使うことをお勧めします。 これらを使用する必要がある場合は、writeWebGL
, rgl.Sweave
, hook_rgl
のヘルプトピックで詳細を確認してください。 もし、これらのメソッドを使うことを推奨しているドキュメントを読んでいたら、作者にアップデートが必要であることを伝えてください。
デフォルトでは、rgl
はシーン内でのマウスのクリックを検出して処理し、それらを使って外観をコントロールします。 現在のハンドラーは以下のコードで確認できます。:
## left right middle wheel
## "trackball" "zoom" "fov" "pull"
ラベル c("left", "right", "middle")
は,3ボタンマウスのボタン,あるいは他のマウスのボタンのシミュレーションを意味する。 "wheel"
はマウスのホイールのことです。
ボタンの動作は、一般的にはクリックやドラッグに相当します。 “mouseMode”
で指定できるボタンやホイールの値は以下の通りです。
Mode | Description |
---|---|
"none" |
No action |
"trackball" |
The mouse acts as a virtual trackball. Clicking and dragging rotates the scene |
"xAxis" , "yAxis" , "zAxis" |
Like "trackball" , but restricted to rotation about one axis |
"polar" |
The mouse affects rotations by controlling polar coordinates directly |
"selecting" |
The mouse is being used by the select3d function |
"zoom" |
The mouse zooms the display |
"fov" |
The mouse affects perspective by changing the field of view |
"pull" |
Rotating the mouse wheel towards the user “pulls the scene closer” |
"push" |
The same rotation “pushes the scene away” |
"user" |
A user action set by rgl.setMouseCallbacks , rgl.setWheelCallback . Use rgl.getMouseCallbacks and rgl.getWheelCallback to retrieve |
以下の機能は、シーン内での選択にマウスを使用します。
Function | Description |
---|---|
identify3d : |
like the classic graphics identify function |
select3d : |
returns a function that tests whether a coordinate was selected |
selectpoints3d : |
selects from specific objects |
selectionFunction3d
は,投影とマウスの選択領域の情報から,選択関数を生成します. これは上記の関数で内部的に使用されます。
rgl.select3d
関数は select3d
の古いバージョンであり、 rgl.select
は低レベルのサポート関数です。
rgl
にはアニメーションを作成するためのいくつかの関数があります。 これらの関数は、現在の現実世界の時間に応じてシーンを更新する関数をベースにしており、それらの関数を繰り返し呼び出すことで実現しています。 これらの関数は:
Function | Description |
---|---|
play3d : |
Repeatedly call the update function |
spin3d : |
Update the display by rotating at a constant rate |
par3dinterp : |
Compute new values of some par3d parameters by interpolation over time |
There are three functions in rgl
that support control of an rgl
scene using the TCL/TK framework.
アニメーションをディスク上のファイルに出力する方法については、movie3d
関数を参照してください。 現在、アニメーションは rglwidget
で書かれたHTMLではサポートされていませんが、 playwidget
関数で同等の機能が提供されています。
rgl
には、TCL/TKフレームワークを使ったrgl
シーンの制御をサポートする3つの関数があります。
Function | Description |
---|---|
tkspin3d : |
Set up buttons in a window to control a scene |
tkspinControl : |
Embed the control buttons in a separate TCL/TK frame |
tkpar3dsave : |
Create a dialog to interactively save mouse actions |
これらの関数は、以前は tkrgl
パッケージに含まれていました (名前に tk
のプレフィックスは付いていません)。 このパッケージは現在では非推奨となっています。
rgl
には、シーンをディスクに書き出して他のソフトウェアで利用したり、読み込んだりするためのいくつかの関数が含まれています。
忠実度の高いものから低いものの順に、以下のような関数があります。:
Function | Description |
---|---|
scene3d : |
Save a scene to an R variable, which can be saved and reloaded |
rglwidget : |
Prints as HTML and Javascript to display a scene in a web browser. (See also User Interaction in WebGL.) |
writeWebGL : |
Deprecated. |
writeASY : |
Write files for Asymptote |
writePLY : |
Write PLY files (commonly used in 3D printing) |
readOBJ , writeOBJ : |
Read or write OBJ files (commonly used in 3D graphics) |
readSTL , writeSTL : |
Read or write STL files (also common in 3D printing) |
また、3D情報を保存せずに、スナップショットなどのシーンの記録を保存する機能もあります。:
Function | Description |
---|---|
snapshot3d : |
Save a PNG file bitmap of the scene |
rgl.postscript : |
Save a Postscript, LaTeX, PDF, SVG or PGF vector rendering of the scene |
movie3d : |
Save a series of bitmaps to be assembled into a movie |
rgl.pixels : |
Obtain pixel-level information about the scene in an R variable |
rgl.Sweave : |
Driver function for inserting a snapshot into a Sweave document. |
hook_rgl , hook_webgl : |
knitr hook functions for inserting images into a document. |
setupKnitr : |
Function to set up knitr hooks |
rgl.snapshot
関数は、snapshot3d()
の低レベルバージョンです。 この関数は、rgl
ディスプレイが画面上にあることを要求し、そこからコピーします。 関数 snapshot3d()
は webshot2
パッケージを使おうとするので、ディスプレイがなくても動作します。 関数 rgl.Sweave.off
, Sweave.snapshot
は、Sweave の処理に関与しており、通常ユーザーが呼び出すことはありません。
Rの中でrgl
シーンを表示する方法は2種類あります。 1つは専用のウィンドウで表示する方法です。 Unix系ではX11ウィンドウです。 Microsoft Windowsでは、ネイティブウィンドウです。 macOSでは、これをサポートするために、XQuartz システム( https://www.xquartz.org 参照)をインストールする必要があります。
この表示を抑制するには、新しい rgl
ウィンドウを開く前に options(rgl.useNULL = TRUE)
を設定してください。 Rを起動する前にこの設定を行う方法については、rgl.useNULL
関数のヘルプページを参照してください。
シーンを表示する新しい方法は、ブラウザのウィンドウや RStudio の Viewer ペインで WebGL を使用することです。 これを選択するには、options(rgl.printRglwidget = TRUE)
を設定します。 シーンを変更する各操作は、印刷時に新しい WebGL 表示のトリガーとなる値を返します。 を表示します。
シーンを Web ページにエクスポートするには、次のような方法があります。 また、古い方式もありますが、これはもうサポートされていません。
推奨される方法は、htmlwidgets
フレームワークで動作します(http://www.htmlwidgets.org/ 参照)。 knitr
の R Markdown ドキュメントで、rglwidget
関数を使います。 (チャンクオプションのwebgl=TRUE
を使うこともできますが、rglwidget
を明示的に使うことをお勧めします)。 この方法では、RStudio でも rgl
のシーンを表示することができます。 また、rgl
シーン以外にも、様々なコントロールを表示することができますし、便利なユーティリティー関数もいくつかあります。:
Function | Description |
---|---|
propertyControl : |
set individual properties |
clipplaneControl : |
control a clipping plane |
subsetControl : |
control which objects are displayed |
ageControl : |
“age” vertices of an object |
vertexControl : |
control properties of vertices |
par3dinterpControl : |
WebGL control like par3dinterp |
playwidget : |
display and automate controls |
toggleWidget : |
display a button to toggle some items |
%>%: | magrittr pipe |
figHeight , figWidth : |
Dimensions of figures in R Markdown document |
rglShared : |
share data using crosstalk package |
rglMouse : |
change mouse mode in RGL scene |
asRow : |
arrange multiple objects in an HTML display |
getWidgetId : |
get the elementId from a widget |
これらの関数は、Shiny アプリで上記の方式で動作します。:
Function | Description |
---|---|
sceneChange : |
used in Shiny for large scene changes |
shinyGetPar3d , shinySetPar3d : |
get or set par3d values from Shiny |
shinyResetBrush : |
reset the mouse brush in Shiny |
また、selectionFunction3d
関数は、Shiny を使用する際に、マウスのインタラクションに関与する可能性があります。
主に内部で使用される関数もあります。 elementId2Prefix
, playwidgetOutput
, renderPlaywidget
, rglwidgetOutput
, renderRglwidget
, registerSceneChange
. 詳細は,vignette User Interaction in WebGL に記載されています。 また,関数 lowlevel
, highlevel
, rglId
は,関数の結果を自動的に印刷するためにマークする内部用の関数です. 最後に、実験的な関数である setUserShaders
は、WebGLで手書きのシェーダーを使用することができます。
従来の方法では、writeWebGL
関数を使用して、シーンを HTML と Javascript のコードにエクスポートします。 これらの関数は、エクスポートされたシーンを操作するための HTML と Javascript を記述します。: propertySlider
, clipplaneSlider
, subsetSlider
, toggleButton
, propertySetter
, subsetSetter
, ageSetter
, par3dinterpSetter
, vertexSetter
, matrixSetter
. 代わりに、より新しい関数を使ってください。
rgl
は表示する全てのシーンの内部構造を保持しています。 以下の関数は、それらの情報を見つけたり、操作するためのものです。 関数のバージョンに *3d
と rgl.*
の両方がある場合、ほとんどのユーザーは *3d
バージョンを使用する必要があります。
Function | Description |
---|---|
open3d : |
新しいウィンドウを開く |
close3d , rgl.close : |
現在のウィンドウを閉じる |
cur3d , rgl.cur : |
アクティブなデバイスの id |
set3d , rgl.set : |
特定のデバイスをアクティブに設定 |
pop3d , rgl.pop : |
シーンからオブジェクトを削除 |
clear3d , rgl.clear : |
特定のクラスの全てのオブジェクトを削除 |
ids3d , rgl.ids : |
全ての現在のオブジェクトの id と型 |
これらの関数は主にプログラミングを目的としており、対応する*3d
の関数はありません。:
Function | Description |
---|---|
rgl.bringtotop : |
bring the current window to the top |
rgl.dev.list : |
ids of all active devices |
rgl.attrib , rgl.attrib.info , rgl.attrib.count : |
attributes of objects in the scene |
rgl.projection : |
return information about the current projection |
rgl.user2window , rgl.window2user : |
convert between coordinates in the current projection |
as.triangles3d
の汎用関数は、triangles3d
に渡すのに適した形式で座標を抽出することを目的としています。 現在、rglId
オブジェクトに対するメソッドが提供されています。
これらに加えて、ユーザーが滅多に呼び出すことのない関連関数がいくつかあります。rgl.init
, rgl.open
, rgl.quit
ほとんどの rgl
関数は、内部的には「同次座標」で動作します。 このシステムでは、3次元の点は一般的に (x, y, z, w) と呼ばれる4つの座標で表されます。 w が 0 でない場合、対応するユークリッド点は (x/w, y/w, z/w) となり、w の 0 値は「無限遠の点」に対応します。 このシステムの利点は,並進や視点の移動を含むアフィン変換が,4×4の行列の乗算による線形変換になることです.
rgl
には,同次座標を扱うための以下の関数があります。:
Function | Description |
---|---|
asEuclidean , asHomogeneous : |
convert between homogeneous and Euclidean coordinates when x, y and z are columns |
asEuclidean2 , asHomogeneous2 : |
convert when x, y and z are rows |
rotate3d , scale3d , translate3d : |
apply a transformation |
transform3d : |
apply a general transformation |
rotationMatrix , scaleMatrix , translationMatrix : |
compute the transformation matrix |
identityMatrix : |
return a 4 x 4 identity matrix |
projectDown : |
a 3D to 2D projection down a vector |
関数 GramSchmidt
もありますが、これは主に内部使用のためのもので、3x3の行列のグラムシュミット直交化を行いますが、cyliner3d
で使用するためにいくつかの特殊化を行っています。
シーンをインタラクティブに回転させて特定のビューにし、それを lattice
やベースグラフィックスで表示するのが便利な場合があります。 rglToLattice
と rglToBase
関数はこれをサポートします。
例えば、まず火山のデータを rgl
で表示します。:
この表示はインタラクティブなものですが、lattice
wireframe
や base graphics persp
の機能を使って、初期の表示を再現することができます。
angles <- rglToBase()
persp(volcano, col = "green", shade = TRUE,
theta = angles$theta, phi = angles$phi)
なお、これらの機能を利用するには、orientlib
パッケージが利用可能である必要があります。
pkgdown
ウェブサイトの作成pkgdown
WebサイトでのRGLの使用方法については、“Using RGL in pkgdown Web sites” vignetteで説明しています。 ユーティリティー関数 in_pkgdown_example
は、pkgdown
が使用されていることを検出するために使用できます。
rglwidget
で作成されるWebGLディスプレイは、本パッケージに含まれる大量の Javascript コードに依存しています。 このコードの開発を支援するために、makeDependency
関数が書かれました。 Javascript を含む他のパッケージでも役に立つかもしれません。
このセクションでは、このドキュメントの他のカテゴリに当てはまらない雑多な機能を説明します。
setGraphicsDelay
関数は、macOS のバグと思われる現象を回避するためのものです。 rgl
ウィンドウの後に標準のプロットウィンドウがすぐに開かれると、Rがクラッシュすることがあります。 この関数は、必要と思われるときに1秒の遅延を挿入します。
このvignetteは常に進行中のものです。 rgl` パッケージのいくつかの側面が説明されていなかったり、例がなかったりします。 以下のリストが空でなければ、完全に見落とされている機能があるかもしれません。
## [1] "compare_proxy.mesh3d" "deform.mesh3d" "divide.mesh3d"
## [4] "normalize.mesh3d" "rgl.abclines" "rgl.bbox"
## [7] "rgl.bg" "rgl.clipplanes" "rgl.lines"
## [10] "rgl.linestrips" "rgl.material" "rgl.planes"
## [13] "rgl.points" "rgl.primitive" "rgl.quads"
## [16] "rgl.spheres" "rgl.sprites" "rgl.surface"
## [19] "rgl.texts" "rgl.triangles"
このドキュメントでは、以下の関数と定数について説明しています:
。