低水準なカメラ プロパティ
設定可能なカメラ プロパティ
カメラ グラフィックスは、カメラの位置や方向をコントロールするさまざまな座標軸プロパティをベースにしています。一般に、campos
、camtarget
、camup
など、カメラ用のコマンドを使用すれば、以下のプロパティに直接アクセスする必要はありません。
プロパティ | 説明 |
---|---|
CameraPosition | Axes 単位で視点の位置を指定します。 |
CameraPositionMode |
|
CameraTarget | カメラを向ける Axes 内の位置を指定します。 |
CameraTargetMode |
|
CameraUpVector | 表示軸を中心としたカメラの回転は、上方向を示すベクトルで定義されます。 |
CameraUpVectorMode |
|
CameraViewAngle | レンズの視野を指定します。CameraViewAngle の値を指定すると、MATLAB は Figure に合わせて座標軸を表示域に合わせません。 |
CameraViewAngleMode |
|
Projection | 正投影または透視投影を選択します。 |
既定の視点の選択
すべてのカメラ モード プロパティが auto
(既定の設定) に設定されている場合、MATLAB は表示を自動的にコントロールし、位置を表す四角形いっぱいにシーンを表示するという前提に基づいて適切な値を選択します (この四角形は、座標軸の Position
プロパティの幅および高さ要素で定義されます)。
既定の設定では、MATLAB は以下のようになります。
シーンの方向が標準の MATLAB の 2 次元または 3 次元表示になるように
CameraPosition
を設定します (view
コマンドを参照)。CameraTarget
をプロット ボックスの中央に設定します。2 次元表示の場合は "y" 方向が上向きになり、3 次元表示の場合は "z" 方向が上向きになるように、
CameraUpVector
を設定します。CameraViewAngle
を、位置を表す四角形 (座標軸のPosition
プロパティで定義) 内にシーンが収まる最小の角度に設定します。正投影を使用します。
この既定の動作では、一般的に必要な結果が得られます。ただし、これらのプロパティは有用な結果が得られるように変更することができます。
シーンに対するカメラの移動
カメラは Axes で定義された 3 次元空間のどの位置にも移動することができます。カメラの方向は、その位置に関係なくターゲットに向けられたままです。カメラが移動すると、MATLAB はカメラ画角を変えて、対象物を囲む四角形全体を表示するようにします。
シーンの移動
シーン内でカメラを移動することで、フライバイ効果を生み出すことができます。そのためには CameraPosition
プロパティを連続的に変更しながらそれをターゲットの方向に移動します。カメラは空間を移動するので、カメラのターゲットを通過すると方向を変えます。CameraViewAngleMode
を manual
に設定すると、カメラを移動する度に MATLAB によってシーンの自動サイズ調整がオーバーライドされます。
CameraPosition
および CameraTarget
を更新すると、移動する方向は対象物を通り過ぎてもそのまま保持されます。
Projection
を perspective
に設定すると、遠近の歪み量はカメラがターゲットに近づくにつれて大きくなり、遠ざかるにつれて小さくなります。
例 — 目標に近づくまたは目標から遠ざかる
カメラを表示軸に沿って移動するには、CameraPosition
プロパティの新しい座標を計算しなければなりません。これは、カメラの位置とカメラのターゲット間の距離の一部を (ターゲットに接近するために) 減算するか、(ターゲットから遠ざかるために) 加算することによって実現します。
関数 movecamera
は引数 dist
が正ならば対象物に接近し、dist
が負ならば遠ざかるような新しい CameraPosition
を計算します。
function movecamera(dist) %dist in the range [-1 1] set(gca,'CameraViewAngleMode','manual') newcp = cpos - dist * (cpos - ctarg); set(gca,'CameraPosition',newcp) function out = cpos out = get(gca,'CameraPosition'); function out = ctarg out = get(gca,'CameraTarget');
CameraViewAngleMode
を manual
に設定すると、縦横比が大幅に変更される可能性があります。
シーンの拡大または縮小
CameraViewAngle
プロパティを調整すると、シーンの表示が拡大/縮小されます。角度が大きいと表示範囲は広がり、シーン内の物体が小さく見えます。同様に、角度が小さいと対象物は大きく見えます。
CameraViewAngle
を変更すると、カメラの位置を変えることなくシーンが大きくなったり小さくなったりします。これは、カメラの位置を変更する場合に発生するように、対象物を通過して視点を移動してしまうことで対象物がシーンの範囲外になることを防止しながら、拡大を行う場合に望ましい方法です。また、CameraViewAngle
を変更しても、Figure の Projection
プロパティが perspective
に設定されている場合に CameraPosition
を変更した場合ほど、シーンに適用される遠近の度合いが影響を受けることはありません。
シーンの回転
view
コマンドを使用すると、方位角を変更して "z" 軸まわりに視点を回転させたり、仰角を変更して方位角の周辺に視点を回転させたりできます。これは、表示軸の長さを半径とする球面の表面に沿って、シーンの周りでカメラを回転させる効果をもっています。CameraPosition
を変更しても同じ効果を生み出すことができますが、そのためには view
を使用する際に MATLAB で必要な計算を行わなければなりません。
たとえば、関数 orbit
はシーンの周りを回転するようにカメラを移動します。
function orbit(deg) [az, el] = view; rotvec = 0:deg/10:deg; for i = 1:length(rotvec) view([az+rotvec(i) el]) drawnow end
サイズ変更なしでの回転
CameraViewAngleMode
が auto
の場合、MATLAB では座標軸の位置を表す四角形にシーンがぴったり収まるように CameraViewAngle
が計算されます。これによって、シーンの回転時に外観サイズが変化します。回転するときのサイズ変更を回避するには、CameraViewAngleMode
を manual
に設定しなければなりません (これは、CameraViewAngle
プロパティに値を指定するときに自動的に発生します)。関数 orbit
でこれを行うには、以下のステートメントを追加します。
set(gca,'CameraViewAngleMode','manual')
表示軸の回転
シーンの方向は、上向きに定義された方向を指定することで変更できます。MATLAB の既定の "上向き" は、2 次元表示では "y" 軸方向 (CameraUpVector
が [0 1 0]
)、3 次元表示では "z" 軸方向 (CameraUpVector
が [0 0 1]
) として定義されます。ただし、ユーザーは「上向き」を任意の方向に指定することができます。
CameraUpVector
プロパティが定義するベクトルは、カメラの座標系の 1 つの軸を形成します。内部的に MATLAB は、指定したベクトルをカメラ方向 (すなわち表示軸) と垂直な面に投影することによって、カメラの上向きベクトルの実際の方向を決めます。これによって、CameraUpVector
プロパティがこの平面上に存在する必要がなくなったため、仕様が簡略化されます。
多くの場合、目的の上向きベクトルを "x" 軸、"y" 軸、および "z" 軸に対する角度として可視化すると便利です。その後、"方向余弦" を使用して、角度をベクトル要素に変換できます。単位ベクトルの場合、式は次のように単純化されます。
ここで、角度 α、β、γ を度で指定します。
XComponent = cos(α*(pi/180));
YComponent = cos(β*(pi/180));
ZComponent = cos(γ*(pi/180));
方向余弦の詳細については、ベクトル解析に関する数学の文献を参照してください。
カメラの上向きベクトルの計算
z 軸と 30°の角度をもち、y-z 平面上にある上向きベクトルを指定するには次の式を使用します。
upvec = [cos(90*(pi/180)),cos(60*(pi/180)),cos(30*(pi/180))];
また、次のように CameraUpVector
プロパティを設定します。
set(gca,'CameraUpVector',upvec)
この方向をもつ球面を描画すると、次のようになります。