コンテンツにスキップ

式を使ってカメラアングルを駆動する

この例では、カメラの回転を駆動して常に特定の Screen を向くようにするシステムを構築します。

目標は、カメラと Screen のどちらが床のどこに移動しても、カメラが常に指定した Screen を向くようにすることです。この例では高さの変化を補正しようとはせず、ステージ内の X 軸と Z 軸の位置変化のみを扱います。

camera tracking demo

考え方は、カメラとターゲット Screen の間の床に直角三角形を構築することです。三角法を使って、カメラから Screen への角度を計算できます。

この例の基本機能は、関数 atan2 によって提供されます。これを使って、カメラとターゲット Screen の相対位置から構築する三角形の対角を計算します。

overhead view

上記の三角形を構築するには、2 つの直線の辺、つまり X 軸(左右)用と Z 軸(前後)用を作る必要があります。これは、まず変数を保持する ExpressionVariables device を作成し、各辺を個別に定義することで行います。

2 つの式は cam_screen_offset_xcam_screen_offset_z という名前にします。これらは関数変数で、つまり後で他の式で使える小さな式であり、読みやすさを助け、結果が期待どおりであることを検証し、システムを構築した思考プロセスを示します。

cam_screen_offset_x の計算方法を詳しく見てみましょう。

ledscreen:screen.offset.x - camera:cam_1.offset.x

これは、Screen の X 位置と比較したカメラの X 軸上の位置の差です。これが上記の三角形の対辺を作ります。

Screen とカメラの両方で .x.z に置き換えるだけで、Z 軸についてこれを繰り返せます。これが三角形の隣辺を作ります。

三角形の辺が構築されたら、三角法を使って目的の角度を作れます。これも式変数を使って計算し、他の場所で使える名前を付けます。この例では cam_screen_y_angle を使います。

この式は、辺の長さから目的の角度に変換する必要があります。これは atan2 関数を使って実現します。この関数は xy の 2 つの引数を取ります。x / y で作られるタンジェントの逆数を計算しますが、これらの値の符号も認識して補正でき、任意の入力に対して正確な値を提供します。

角度のタンジェントは 対辺 / 隣辺 に等しいことが分かっているので、cam_screen_offset_x() を対辺、cam_screen_offset_z() を隣辺として使えます。したがって:

atan2(cam_screen_offset_x(), cam_screen_offset_z()) は対角をラジアンで返します。度に変換したいので、さらに degrees の呼び出しでラップできます:

degrees(atan2(cam_screen_offset_x(), cam_screen_offset_z()))

上記の式が決まると、expression variable device は次のようになります:

expressions written

角度が決まると、式 cam_screen_y_angle() は、カメラがターゲット Screen を向くためにカメラの Y 回転フィールドを設定する必要がある角度に評価されます。

これは、position receiver デバイスと、カメラの Y 回転を制御する axis expression を作成することで実現できます。

expressions written

このようなシステムは拡張できます。たとえば、ledscreen:screen を、ターゲット Screen を返す別の関数変数に置き換えることで、カメラのターゲットを切り替えられます。これ自体は、外部プロトコル と、どの Screen を返すかを選択する if 関数 で駆動できます。

あるいは、このシステムを複製して、カメラと Screen の相対的な高さの変化に応じたターゲティングを可能にできます。