Main Content

低水準なカメラ プロパティ

設定可能なカメラ プロパティ

カメラ グラフィックスは、カメラの位置や方向をコントロールするさまざまな座標軸プロパティをベースにしています。一般に、camposcamtargetcamup など、カメラ用のコマンドを使用すれば、以下のプロパティに直接アクセスする必要はありません。

プロパティ

説明

CameraPosition

Axes 単位で視点の位置を指定します。

CameraPositionMode

automatic モードでは、シーンに基づいて位置を決めます。manual モードではユーザーが視点の位置を指定します。

CameraTarget

カメラを向ける Axes 内の位置を指定します。CameraPosition と共に視点軸を定義します。

CameraTargetMode

automatic モードでは、MATLAB®CameraTarget を Axes のプロット ボックスの中心に指定します。manual モードでは、ユーザーが位置を指定します。

CameraUpVector

表示軸を中心としたカメラの回転は、上方向を示すベクトルで定義されます。

CameraUpVectorMode

automatic モードでは、MATLAB は 2 次元表示に対しては正の y 軸に沿い、3 次元表示では正の z 軸に沿って上向きベクトルの方向を決定します。manual モードではユーザーが位置を指定します。

CameraViewAngle

レンズの視野を指定します。CameraViewAngle の値を指定すると、MATLAB は Figure に合わせて座標軸を表示域に合わせません。

CameraViewAngleMode

automatic モードでは、MATLAB はシーン全体を取り込むのに必要な最小の角度に画角を調整します。manual モードでは、ユーザーが角度を指定します。

CameraViewAngleModemanual に設定すると、表示域に合わせる動作がオーバーライドされます。

Projection

正投影または透視投影を選択します。

既定の視点の選択

すべてのカメラ モード プロパティが auto (既定の設定) に設定されている場合、MATLAB は表示を自動的にコントロールし、位置を表す四角形いっぱいにシーンを表示するという前提に基づいて適切な値を選択します (この四角形は、座標軸の Position プロパティの幅および高さ要素で定義されます)。

既定の設定では、MATLAB は以下のようになります。

  • シーンの方向が標準の MATLAB の 2 次元または 3 次元表示になるように CameraPosition を設定します (view コマンドを参照)。

  • CameraTarget をプロット ボックスの中央に設定します。

  • 2 次元表示の場合は "y" 方向が上向きになり、3 次元表示の場合は "z" 方向が上向きになるように、CameraUpVector を設定します。

  • CameraViewAngle を、位置を表す四角形 (座標軸の Position プロパティで定義) 内にシーンが収まる最小の角度に設定します。

  • 正投影を使用します。

この既定の動作では、一般的に必要な結果が得られます。ただし、これらのプロパティは有用な結果が得られるように変更することができます。

シーンに対するカメラの移動

カメラは Axes で定義された 3 次元空間のどの位置にも移動することができます。カメラの方向は、その位置に関係なくターゲットに向けられたままです。カメラが移動すると、MATLAB はカメラ画角を変えて、対象物を囲む四角形全体を表示するようにします。

シーンの移動

シーン内でカメラを移動することで、フライバイ効果を生み出すことができます。そのためには CameraPosition プロパティを連続的に変更しながらそれをターゲットの方向に移動します。カメラは空間を移動するので、カメラのターゲットを通過すると方向を変えます。CameraViewAngleModemanual に設定すると、カメラを移動する度に MATLAB によってシーンの自動サイズ調整がオーバーライドされます。

CameraPosition および CameraTarget を更新すると、移動する方向は対象物を通り過ぎてもそのまま保持されます。

Projectionperspective に設定すると、遠近の歪み量はカメラがターゲットに近づくにつれて大きくなり、遠ざかるにつれて小さくなります。

例 — 目標に近づくまたは目標から遠ざかる

カメラを表示軸に沿って移動するには、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');

CameraViewAngleModemanual に設定すると、縦横比が大幅に変更される可能性があります。

シーンの拡大または縮小

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

サイズ変更なしでの回転

CameraViewAngleModeauto の場合、MATLAB では座標軸の位置を表す四角形にシーンがぴったり収まるように CameraViewAngle が計算されます。これによって、シーンの回転時に外観サイズが変化します。回転するときのサイズ変更を回避するには、CameraViewAngleModemanual に設定しなければなりません (これは、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)

この方向をもつ球面を描画すると、次のようになります。