rgl の概要

Duncan Murdoch

5月 15, 2021

訳注: 訳については仮訳です。リンクは機能していません。日本語環境はほとんど未検証です。

はじめに

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 のアプローチをお勧めします。

なお、plot3dpersp3d はどちらもジェネリック関数で、以下のメソッドが定義されています。

methods(plot3d)
##  [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
methods(persp3d)
## [1] persp3d.ashape3d* persp3d.default*  persp3d.deldir*   persp3d.formula* 
## [5] persp3d.function* persp3d.tri*      persp3d.triSht*  
## see '?methods' for accessing help and source code

グラフィカルな要素の追加

原始的な図形

古典的なグラフィックスに pointslines があるように、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")
aspect3d(1,1,1)

上記の *3d 関数の他に、さらに低レベルの関数として

があります。
これらの関数は、上位の *3d 関数とうまく連携できないので、使用しないようにしてください。 詳しくは ?r3d のヘルプトピックを参照してください。

シーンの見た目をコントロールする

照明(ライティング)

ほとんどのシーンでは、オブジェクトは「照明」されています。つまり、オブジェクトの見た目は、シーン内のライトとの相対的な位置や方向に依存します。 通常、ライト自体は表示されませんが、オブジェクトへの影響は表示されます。

照明の位置と特性を指定するには、light3d 関数を使用します。 照明は無限に遠くにある場合もあれば、シーンの中に埋め込まれている場合もあります。 照明の特性には、ambientdiffusespecular の各成分があり、すべてのデフォルトは白です。 デフォルトでは白になります。 ambient 成分は、どの方向から見ても同じように見えます。 diffuse 成分は,表面と光の間の角度に依存し,specular 成分は,見る人の位置も考慮します.

関数 rgl.light は、異なるデフォルトを持つ下位の関数です。 通常は light3d を使用してください。

物質(マテリアル)

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_stexture_t で、テクスチャ座標も行列として受け取ります。

例えば、以下のコードでは、2Dプロットの4つのコピーを四角形に表示しています。

filename <- tempfile(fileext = ".png")
png(filename = filename)
plot(rnorm(1000), rnorm(1000))
dev.off()
## quartz_off_screen 
##                 2
open3d()
## null 
##    9
xyz <- cbind(c(0,1,1,0), 0, c(0,0,1,1))
quads3d(xyz, texture = filename, texcoords = xyz[,c(1, 3)]*2, col = "white", specular = "black")

フォント

rgl では、テキストの描画にベースグラフィックスと同じ考え方を採用しており、"sans", "serif", "mono" というフォントファミリーがあり、これらの種類のテキストを描画します。 rgl では、"symbol" のフォントファミリーはサポートされていません。

新しいフォントファミリーは、低レベルの関数 rglFonts を使って定義することができます。 より簡単には、高レベルの関数 rglExtrafonts を使って定義します。 後者の関数を使用するには、extrafont パッケージがインストールされている必要があります。

par3d: その他のグラフィックパラメータ

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" における material3dbg3d のデフォルト値をそれぞれ提供します。

メッシュ: 形状の構築

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 を使用して滑らかな外観を得ることができます。

関数 tmesh3d, qmesh3d は廃止されました。 代わりに mesh3d を使用してください。

シェイプの基本的なクラス構造は次のとおりです。

"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でドキュメントを作成することです。 ドキュメントの初期段階では、セットアップコードチャンクの一つに以下のようなコードがあるはずです。:

```{r echo=FALSE, include=FALSE}
library(rgl)
setupKnitr(autoprint = TRUE)
```

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)

複雑な事情がある場合には、いくつかの違いがあります。

plots <- NULL
for (i in 1:3) {
  plot3d(rnorm(10), rnorm(10), rnorm(10))
  plots <- htmltools::tagList(plots, rglwidget())
  close3d()
}
plots
foreignHigh()   # Produces a high level plot, but doesn't return
                # an appropriate value
highlevel()
foreignLow()    # Modifies the previous plot
lowlevel()

これにより、コードチャンクの最後に、修正が完了したとみなされる出力が表示されます。

PDF 出力の作成

PDF プレビューアの中には、インタラクティブな 3D グラフィックをサポートしているものもありますが、ほとんどのものはサポートしていません。 R Markdown ドキュメント内の rgl シーンのスクリーンショットを PDF 出力で作成するには、上記の指示に従うだけです。 自動印刷はPDF出力を検出し、snapshot3dを使って挿入用のPNGファイルを作成します。 (他のフォーマットのグラフィックを挿入したい場合は、以下を参照してください。)

どうしてもインタラクティブな出力が必要な場合は、writeASY関数を参照してください。

プロットの手動挿入

前述の setupKnitr(autoprint = TRUE) メソッドは、あまり使いたくないかもしれません。 これは非常に新しく、まだバグがあるかもしれません。また、古いドキュメントを持っていて、そのように動作するように編集したくない場合もあるでしょう。

このような場合には、手動でプロットを挿入することができます。 U セットアップコードを見る

```{r echo=FALSE, include=FALSE}
library(rgl)
setupKnitr()
```

そして、プロットを挿入したいときはいつでもトップレベルで rglwidget() を呼び出します。

autoprint` を使用していない場合のデフォルトの動作には、他にもいくつかの違いがあります。

古い方法

rgl のシーンをドキュメントに挿入するオリジナルの方法は、writeWebGL 関数を使って、ドキュメントに挿入する HTML コードを書くことでした。 その後、Sweaveknitrのフックが追加されました。 これらはもうメンテナンスされていませんので、古い文書を更新して新しい方法を使うことをお勧めします。 これらを使用する必要がある場合は、writeWebGL, rgl.Sweave, hook_rgl のヘルプトピックで詳細を確認してください。 もし、これらのメソッドを使うことを推奨しているドキュメントを読んでいたら、作者にアップデートが必要であることを伝えてください。

ユーティリティー機能

ユーザーインタラクション

デフォルトでは、rgl はシーン内でのマウスのクリックを検出して処理し、それらを使って外観をコントロールします。 現在のハンドラーは以下のコードで確認できます。:

par3d("mouseMode")
##        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 関数で同等の機能が提供されています。

TCL/TKとの連携

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 表示のトリガーとなる値を返します。 を表示します。

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 は表示する全てのシーンの内部構造を保持しています。 以下の関数は、それらの情報を見つけたり、操作するためのものです。 関数のバージョンに *3drgl.* の両方がある場合、ほとんどのユーザーは *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

3次元ベクトルの扱い

ほとんどの 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 やベースグラフィックスで表示するのが便利な場合があります。 rglToLatticerglToBase 関数はこれをサポートします。

例えば、まず火山のデータを rgl で表示します。:

persp3d(volcano, col = "green")

この表示はインタラクティブなものですが、lattice wireframe や base graphics persp の機能を使って、初期の表示を再現することができます。

lattice::wireframe(volcano, col = "green", 
           screen = rglToLattice())

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 が使用されていることを検出するために使用できます。

Javascriptとの連携

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"

関数の索引

このドキュメントでは、以下の関数と定数について説明しています:

%>%   elementId2Prefix   par3dinterpSetter   rgl.quit   spheres3d  
abclines3d   ellipse3d   particles3d   rgl.select   spin3d  
addNormals   extrude3d   pch3d   rgl.select3d   sprites3d  
addToSubscene3d   facing3d   persp3d   rgl.set   subdivision3d  
ageControl   figHeight   pipe   rgl.setMouseCallbacks   subsceneInfo  
ageSetter   figWidth   planes3d   rgl.setWheelCallback   subsceneList  
arc3d   filledContour3d   play3d   rgl.snapshot   subsetControl  
arrow3d   gc3d   playwidget   rgl.Sweave   subsetSetter  
as.mesh3d   getr3dDefaults   playwidgetOutput   rgl.Sweave.off   subsetSlider  
as.mesh3d.default   getWidgetId   plot3d   rgl.useNULL   surface3d  
as.triangles3d   GramSchmidt   plotmath3d   rgl.user2window   Sweave.snapshot  
asEuclidean   grid3d   points3d   rgl.viewpoint   terrain3d  
asEuclidean2   highlevel   polygon3d   rgl.window2user   tetrahedron3d  
ashape3d   hook_rgl   pop3d   rglExtrafonts   text3d  
asHomogeneous   hook_webgl   projectDown   rglFonts   texts3d  
asHomogeneous2   icosahedron3d   propertyControl   rglId   thigmophobe3d  
aspect3d   identify3d   propertySetter   rglMouse   title3d  
asRow   identityMatrix   propertySlider   rglShared   tkpar3dsave  
axes3d   ids3d   qmesh3d   rglToBase   tkspin3d  
axis3d   in_pkgdown_example   quads3d   rglToLattice   tkspinControl  
bbox3d   layout3d   r3dDefaults   rglwidget   tmesh3d  
bg3d   legend3d   readOBJ   rglwidgetOutput   toggleButton  
bgplot3d   light3d   readSTL   rotate3d   toggleWidget  
box3d   lines3d   registerSceneChange   rotationMatrix   transform3d  
clear3d   lowlevel   renderPlaywidget   scale3d   translate3d  
clearSubsceneList   makeDependency   renderRglwidget   scaleMatrix   translationMatrix  
clipMesh3d   material3d   rgl.attrib   scene3d   tri  
clipObj3d   matrixSetter   rgl.attrib.count   sceneChange   triangles3d  
clipplaneControl   merge.mesh3d   rgl.attrib.info   segments3d   triangulate  
clipplanes3d   mergeVertices   rgl.bringtotop   select3d   triSht  
clipplaneSlider   mesh3d   rgl.clear   selectionFunction3d   turn3d  
close3d   mfrow3d   rgl.close   selectpoints3d   useSubscene3d  
contourLines3d   mouseMode   rgl.cur   set3d   vertexControl  
cube3d   movie3d   rgl.dev.list   setGraphicsDelay   vertexSetter  
cuboctahedron3d   mtext3d   rgl.getMouseCallbacks   setupKnitr   view3d  
cur3d   newSubscene3d   rgl.getWheelCallback   setUserShaders   wire3d  
currentSubscene3d   next3d   rgl.ids   shade3d   writeASY  
cylinder3d   observer3d   rgl.init   shadow3d   writeOBJ  
decorate3d   octahedron3d   rgl.light   shapelist3d   writePLY  
deldir   oh3d   rgl.open   shinyGetPar3d   writeSTL  
delFromSubscene3d   open3d   rgl.pixels   shinyResetBrush   writeWebGL  
dodecahedron3d   par3d   rgl.pop   shinySetPar3d  
dot3d   par3dinterp   rgl.postscript   show2d  
drape3d   par3dinterpControl   rgl.projection   snapshot3d