3Dグラフィックスの座標系

3Dグラフィックスでは,どこからどこまでが描画空間なのかを示すため直方体を使いプロット空間の境界を定義している.プロットするオブジェクトはこの直方体(ボックスと呼ぶ)の中に置かれ,デフォルトで,ボックスの輪郭に線が描かれるので(Boxed->Trueの設定が有効時)プロット範囲が視覚的に確認できる.また,オブジェクトがボックスの外にはみ出るようなことがあれば,はみ出た部分は表示されない.

ボックスに包含する 方向の各プロット範囲はオプションPlotRangeを使い指定する.2Dグラフィックスのときのように,デフォルトで自動設定(PlotRange->Automatic)になっており,Mathematica 内部のアルゴリズムで決定した「重要な部分」だけが描画の対象になる.つまり,部分によってはボックスの外に出てしまい表示されないものもある.そのようなことがないように,すべてを描画対象にするならPlotRange->Allと指定しておく.

多面体操作を定義するパッケージを読み込ませる.
In[1]:=
Click for copyable input
星形の20面体を作る.
In[2]:=
Click for copyable input
星形20面体をボックス内に表示する.
In[3]:=
Click for copyable input
Out[3]=
PlotRangeでプロット範囲を限定する.範囲外になり表示されない部分ができる.
In[4]:=
Click for copyable input
Out[4]=

2Dグラフィックスと同様に3Dでも「実座標」と「スケールされた座標」のどちらでもオブジェクトの位置指定ができる.スケールされた座標は書式Scaled[{sx, sy, sz}]で指定し,各座標値は0から1の値を取る.ボックスの包含する空間は右手座標系で表される.

{x,y,z}プロットする実空間の座標を指定する
Scaled[{sx,sy,sz}]スケールされた座標を指定する.各座標は0から1の値を取る

3Dオブジェクトの座標指定

ボックスの一角に立方体を配置させる.
In[5]:=
Click for copyable input
Out[5]=

ボックス内の実空間のどこに何を配置するかを指定したなら,次はボックス自体をどう表示させるか指定する.まず,ボックスの縦,横,そして,奥行き長の相対比を決める.これは,2Dプロットにおける縦横比の指定に相当する.3Dでは,縦横比の代りにボックス比のオプションBoxRatiosを使いボックスの各辺(つまり,座標軸の範囲)の相対的な長さを指定する.Graphics3Dオブジェクトの場合は,デフォルトで自動設定になっているので(BoxRatios->Automatic),比は実座標の範囲から決定される.

BoxRatios->{xr,yr,zr}ボックスの辺の相対的な長さを指定する
BoxRatios->Automatic実座標の範囲から計算されるボックス比を使う(Graphics3Dのデフォルト値)

3Dオブジェクトにおける境界ボックスの辺の長さ指定

方向にボックスを引き伸ばして星形20面体を表示する.
In[6]:=
Click for copyable input
Out[6]=

立体の描画では,どの位置からどの角度で物体を眺めるかといった位置関係を設定する必要がある.位置関係を表す値を「ビューポイント」と呼び,これはオプションViewPointを使い指定する.

「3D曲面プロット」に,よくあるビューポイントの設定例を示したので参考にするとよい.しかし,そこにある設定位置にとらわれる必要はなく,どんな設定をしても構わない.

ビューポイントの指定書式はViewPoint->{sx, sy, sz}である.ここで,値 si はボックス中心を原点()とした特殊な座標系で与えられる.座標の取る値はボックスの最長辺を1とするスケールされた相対値とする.ボックスの他の辺の長さはボックス比(BoxRatios)から決定される.ボックスが立方体ならば,各座標軸はからの範囲を取る.ビューポイントは必ずボックスの外になければいけないことに注意する.

デフォルトのビューポイント指定,つまり,で図を表示する.
In[7]:=
Click for copyable input
Out[7]=
ビューポイントを境界ボックスの一角に近付けると図はこのように見える.
In[8]:=
Click for copyable input
Out[8]=
ボックスから離れるに従い遠近効果が小さくなる.
In[9]:=
Click for copyable input
Out[9]=
オプション
デフォルト値
ViewPoint{1.3,-2.4,2}表示するオブジェクトを眺める位置指定 (ビューポイント)をスケールされた特殊座標で指定する
ViewCenterAutomatic表示領域の中心を示すスケールされた特殊座標系の点
ViewVertical{0,0,1}表示領域における視野垂直方向を示すスケールされた特殊座標系の方向
ViewAngleAutomaticグラフィックスを見るために使われるシミュレートされるカメラに対する半角の開口部
ViewVectorAutomaticグラフィックスの正規の座標系におけるシミュレートされるカメラの位置と方向

3Dオブジェクトの配置と方向付け

3Dグラフィックスでは,描画するオブジェクトをどこから眺めるかだけでなく,表示領域の中にどうオブジェクトを「枠組み」するかを指定する必要もある.後者の設定ではオプションViewCenterViewVerticalViewAngleを使う.

ViewCenterはオブジェクトのどこの点が表示領域の中心に現れるか指定するために使用する.中心点はスケールされた特殊座標(0から1)で与える.例えば,ViewCenter->{1/2, 1/2, 1/2}と指定すれば,ボックスの中心と表示領域の中心を一致させることになる.ただし,ビューポイントの設定によってはボックスが対照に表示されないため,このViewCenterの設定では必ずしも表示領域の中心にボックスの中心を持っていけない.そのようなときは,自動設定(ViewCenter->Automatic)にした方がよいかもしれない.

次に,ViewVerticalはオブジェクトのどの方向が表示領域で上を向くか指定するのに使う.ViewVerticalの指定は,表示領域上でオブジェクトのどの方向が上を向くかをスケールされた座標で与えることである.デフォルト値はViewVertical->{0, 0, 1}で,これは 軸が表示領域の垂直方向になるよう表示することを意味する.

Mathematica は最終的な画像を可視化するために,シミュレートされたカメラの属性を使用する.カメラの位置,方向,向きはViewCenterViewVerticalViewPointオプションで決まる.ViewAngleオプションは,カメラレンズの開口部の幅を指定する.ViewAngleはカメラで見ることのできるViewPointからViewCenterまで伸びた線からの最大角度をラジアンで指定する.効率的な視野角はViewAngleの値の2倍である.つまり,ViewAngleは画像の一部でズームインするために効果的に使うことができるということである.ViewAngleのデフォルト値は人間の目にとって一般的な視野角である35度である.

軸が垂直方向に表示するようにViewVerticalを設定する.
In[10]:=
Click for copyable input
Out[10]=
ViewAngleを使い,画像の中心を効率的にズームインする.
In[11]:=
Click for copyable input
Out[11]=

このように,ViewPointViewCenterViewVerticalの一連の設定は,物理的なオブジェクトをどう表示するか指示するために使う.ViewPointはオブジェクトを眺める位置を指定し,ViewCenterはオブジェクトのどこを中心に見るかを指定し,また,ViewVerticalは表示上の垂直方向がオブジェクトのどの方向になるかを指定する.

座標系という点において,ViewPointViewCenterViewVerticalの条件設定は一種の座標変換とも考えられる.つまり,3つの条件設定を使い,実空間における物体の各座標を表示領域の座標に変換している,とも考えられる.

ViewVector->AutomaticオプションViewPointViewCenterの値を使い, シミュレートされるかめらの位置と向きを指定する
ViewVector->{x,y,z}オブジェクトに使用される座標におけるカメラの位置.カメラの向きはViewCenterオプションで決まる
ViewVector->{{x,y,z},{tx,ty,tz}}カメラの位置と点は,オブジェクトに対して使われる座標で焦点が合わされる

ViewVectorオプションに可能な値

カメラの位置と向きはViewPointオプションとViewCenterオプションで完全に決めることができる.しかし,ViewVectorオプションは便利な一般化を提供する.ViewVectorではスケールされた座標を使ってカメラの位置と向きを指定する代りに,グラフィックス内でオブジェクトの位置を決めるのに使われる座標系と同じものを使ってカメラの位置を決めることができる.

以下はカメラを負の 軸上に置き,グラフィックスの中心を向くように指定している.
In[12]:=
Click for copyable input
Out[12]=
これもカメラは同じ位置にあるが,異なる向きを向いている.ViewAngleを合せると,グラフィックスの特定の場所をズームインする.
In[13]:=
Click for copyable input
Out[13]=

3Dオブジェクトの2Dのイメージを得たなら,次にそれをどう描画するかを指定する.グラフィックスオプションは2Dグラフィックスで使ったものと同じである.つまり,縦横比のオプションAspectRatioを使い最終表示領域の縦横の尺度を変えたり,プロット領域のオプションPlotRegionを限定し表示面全体のどこの領域にイメージを表示させるか等の指定ができる.

ドラッグ中心についてグラフィックスを回転させる
Ctrl+ドラッググラフィックスにズームインしたりズームアウトしたりする
Shift+ドラッグスクリーン平面でグラフィックスをパンする

3Dグラフィックスとのインタラクションに使われるマウス操作

グラフィックスをインタラクティブに変更する場合,ビューオプションが変更される.ViewPointを使ってカメラの位置を指定した場合,グラフィックスの回転によりViewPointオプションの値が変更される.ViewVectorを使ってカメラの位置が指定してある場合は,インタラクティブな回転によりそのオプションの値が変化する.どちらの場合も,インタラクティブな回転はViewVerticalオプションの値にも影響を及ぼす.グラフィックスをインタラクティブにズームすることは,ViewAngleオプションの変更と直接呼応する.グラフィックスをインタラクティブにパンすると,ViewCenterオプションの値が変化する.

表示領域の縦横比を変更する.
In[14]:=
Click for copyable input
Out[14]=

グラフィックスの表示段階で,立体のイメージが描画領域に対してなるべく大きくなるように尺度が調整される.多くのグラフィックスではこの調整処理は好ましいが,オブジェクトの向きによってはイメージの大きさが変わってしまう場合がある.そのような効果が出てしまうときは,SphericalRegion->Trueの条件を指定する.すると,境界ボックスを包含する球が想定され(ボックスの中心と球の中心はマッチする),最終イメージの尺度調整が球に対して行われるようになる.つまり,球全体が表示領域に収まるようスケールされる.

プロット領域を引き伸ばした形で表示する.
In[15]:=
Click for copyable input
Out[15]=
SphericalRegion->Trueとすると,ボックスの周りに張った球がちょうど表示領域に入るようスケールが調整される.
In[16]:=
Click for copyable input
Out[16]=

このように,SphericalRegion->Trueと指定しておくと,オブジェクトの大きさがそのオブジェクトの方向によらず一定となる.1つの立体オブジェクトをいろいろな角度から見たアニメーションを作るときに便利になる.

SphericalRegion->False描画対象をなるべく大きくするように尺度を調整する
SphericalRegion->True境界ボックスの周りに仮定した球がすべて表示領域に収まるように全体をスケールする

3Dグラフィックスの表示尺度の調整

New to Mathematica? Find your learning path »
Have a question? Ask support »