Main Content

シーン内のカメラの移動

テクニックの概要

フライスルーは、3 次元空間内でカメラを移動することにより生じる効果で、たとえば、飛行機に乗っているかのようにカメラと一緒に飛んでいるような印象を与えます。そのシーンで物体の不明瞭な部分をフライスルーしたり、またはある特定の点にカメラの焦点を固定した状態にすることで、フライスルーを行うことができます。

たとえば、一連のステップにおいて x 軸に沿ってカメラを移動することでこれらの効果を得ることができます。フライスルーを作成するため、カメラの位置とカメラのターゲットを同時に移動します。

次の例は、フライスルー効果を使用して、風速のベクトル場で定義されるボリューム データ内に表示された等値面の内部を表示します。このデータは北アメリカの空気の流れを示しています。

この例は、以下のようないくつかの可視化手法を使用しています。

  • ボリューム データ内を通過する流体を表示するための等値面とコーン プロット

  • ボリューム データ内の等値面と円錐を照らすためのライティング

  • ボリューム データ内を通るカメラのパスを決めるための流線

  • カメラの位置、カメラのターゲット、ライトの動きを表すための座標

ボリューム データのグラフ表示

はじめの手順として、等値面を描画しコーン プロットを使用して空気の流れをプロットします。

これらのコマンドの使用方法の情報については、isosurfaceisonormalsreducepatchconeplot を参照してください。

コーン プロットを描画する前に、データの縦横比 (daspect) を [1,1,1] に設定することで、最終的な視点に正しいサイズの円錐を計算できます。

load wind
wind_speed = sqrt(u.^2 + v.^2 + w.^2);
figure
p = patch(isosurface(x,y,z,wind_speed,35));
isonormals(x,y,z,wind_speed,p)
p.FaceColor = [0.75,0.25,0.25];
p.EdgeColor = [0.6,0.4,0.4];

[f,vt] = reducepatch(isosurface(x,y,z,wind_speed,45),0.05); 
daspect([1,1,1]);
hcone = coneplot(x,y,z,u,v,w,vt(:,1),vt(:,2),vt(:,3),2);
hcone.FaceColor = 'blue';
hcone.EdgeColor = 'none';

視点の設定

適切に表示するために、視点のパラメーターを定義しなければなりません。

  • 遠近法を選択すると、カメラが等値面の内部を通るときに奥行きを与えます (camproj)。

  • カメラの視点角を固定値に設定することで、必要な部分を拡大させ、全体像がとらえられる角度に自動的に調整します (camva)。

    camproj perspective
    camva(25)
    

光源の指定

カメラの位置に光源を設置し、等値面や円錐の反射特性を変更することで、より現実的に表現できます。

  • カメラの位置に光源を設定すると、等値面の内部を通過するカメラに沿って移動するヘッドライトのようなものを設定することになります (camlight)。

  • 高い反射係数をもつ物体 (SpecularStrengthDiffuseStrength を 1 に設定) で、内部が暗く表現 (AmbientStrength を 0.1 に設定) されるよう、等値面の反射特性を設定します。

  • 円錐の SpecularStrength を 1 に設定すると、高い反射効果を示します。

    hlight = camlight('headlight'); 
    p.AmbientStrength = 1;
    p.SpecularStrength = 1;
    p.DiffuseStrength = 1;
    hcone.SpecularStrength = 1;
    set(gcf,'Color','k')
    set(gca,'Color',[0,0,0.25])

ライティング手法の選択

より滑らかなライティングのために gouraud ライトを使用します。

lighting gouraud

カメラのパスを流線として定義

流線は、ベクトル場での流れの方向を示すものです。次の例ではボリューム データ内を通るパスに投影するために、1 つの流線の xyz 座標を使用します。カメラはこのパスに沿って移動します。次の動作が含まれます。

  • x = 80y = 30z = 11 を始点とする流線を作成します。

  • 流線の xyz 座標を取得します。

  • 流線を削除します (関数 stream3 を使用すると、実際に流線を描かずにそのデータを計算できます)。

    hsline = streamline(x,y,z,u,v,w,80,30,11);
    xd = hsline.XData;
    yd = hsline.YData;
    zd = hsline.ZData; 
    delete(hsline)
    

フライスルーの実装

フライスルーを作成するため、カメラの位置とカメラのターゲットを同じパスに沿って移動します。この例では、カメラよりも x 軸に沿って 5 要素先にカメラ ターゲットが配置されています。また、カメラがターゲットの位置と同じにならないように、ターゲットの x 座標に小さい値が加えられ、xd(n) = xd(n+5) の状況が生じても、カメラとターゲットが同じ位置にならないようにしています。

  • カメラの位置とカメラ ターゲットを更新し、これら両方を流線の座標に沿って移動します。

  • カメラと共にライトも移動します。

  • drawnow を使用して個々の移動の結果を表示します。

    for i=1:length(xd)-5
       campos([xd(i),yd(i),zd(i)])
       camtarget([xd(i+5)+min(xd)/500,yd(i),zd(i)])
       camlight(hlight,'headlight')
       drawnow
    end 

同じデータを固定の視点で可視化するには、coneplot を参照してください。