ベクトル

ベクトルとは

MEL には、ベクトル(vector)という型があります。
ベクトルは、 3 つの数値を 1 つの組にしたもので、 3 次元の座標や色など表すときなどに便利です。
例えば、ベクトルを使用すると 3 回分の加減乗除の計算が 1 回で行なえるので式が簡単になります。
また、 MEL コマンドでベクトルを扱うものも存在します。

ベクトルの例

ベクトルは、 <<>> の間に 3 つの数値や変数を , (カンマ)で区切って並べることによって表します。
ベクトルを定義する時の数値・変数は、整数(int)でも実数(float)のどちらでも使用可能ですが、 ベクトルの 3 つの数値は float 型として扱われます。
以下がベクトルの例です。

<<2, 3, 4>> ← <<2.0, 3.0, 4.0>> と同じです
<<1.5, 2.3, 0.5>>
<<3.2, 2, 5.01>>

ベクトルは、ベクトル型の変数に代入することができます。

$val = 2.5;
vector $vec1 = <<$val, $val, 1.2>>; $vec1 は <<2.5, 2.5, 1.2>> になります
vector $vec2 = <<$val, $val * 2.5, $val - 1.2>>; $vec2 は <<2.5, 6.2, 1.3>> になります

ベクトル型変数の 3 つの数値のうちから 1 つを取り出したいときは、以下のように、 1 つ目は変数名の後に .x 、2 つ目は .y、3 つ目は .z をつけます。

vector $vec3 = <<1.5, 2.5, 3.01>>;
float $valx = $vec3.x; $valx は 1.5 になります
float $valy = $vec3.y; $valy は 2.5 になります
float $valz = $vec3.z; $valz は 3.0 になります

ベクトルは、配列にすることもできます。

vector $avec[] = {<<1.5, 2.3, 3.5>>, <<2.6, 8.2, 1.8>>, <<3.2, 6.7, 5.1>>};
vector $v1 = $avec[0];
float $f1 = $v1.x; $f1 は 1.5 になります
print ($v1.x);

ベクトルの演算子

ベクトルの計算・比較などに使用できる演算子は以下の通りです。

+, -, /, %, +=, -=, /=, %=
2つのベクトルの 3 つの数値同士の演算
例えば、 <<2, 3, 4>> + <<5, 6, 7>> の計算結果は <<7, 9, 11>> になります。
*, *=
ベクトル同士の内積
^
ベクトル同士の外積
||, &&, !, >, <, >=, <=
ベクトルの長さによる比較
==
ベクトルの 3 つの数値がすべて同じ場合に真
!=
ベクトルの 3 つの数値のどれかが違う場合に真

ベクトル関係のコマンド

angle vector1 vector2
vector1とvector2の間の角度(float)を返します。
cross vector1 vector2
vector1とvector2の外積(vector)の値を返します。
dot vector1 vector2
vector1とvector2の内積(float)の値を返します。
mag vector
vectorの長さ(float)の値を返します。
rot vector1 vector2 float
vector1をvector2を軸としてfloatだけ回転したベクトルを返します。
unit vector
vectorの長さを1にしたベクトル(単位ベクトル)を返します。

ベクトルの使用例

vector $v1 = <<1, 2, 3>>;
変数 $v1 にベクトル <<1, 2, 3>> を代入します。
vector $v2 = $v1 + <<4, 5, 6>>;
変数 $v1 にベクトル <<4, 5, 6>> を加算します。
vector $v3 = $v1 + $v2;
ベクトル変数 $v1$v2 を加算します。
もちろん、$v3 もベクトル変数になります。
$x = $v1.x;
変数 $x$v1 の X 成分を代入します。
print ($v1.x);
$v1 の X 成分を表示します。
この場合、( ) が無いとエラーになることに注意してください。
vector $v4 = <<$v1.x, $v2.y, $v3.z>>;
ベクトル変数 $v4 の X 成分に $v1 の X 成分を、 Y 成分に $v2 の Y 成分を、 Z 成分に $v3 の Z 成分を代入します。
このとき、直接 X 成分に代入はできないので $v4.x=$v1.x などとはできません。
vector $v5 = 2.5 * $v4;
ベクトル変数 $v4 に 2.5 を乗算します。(スカラー積)
vector $v6 = 3 + $v4;
ベクトル変数 $v4 に 3 を加算します。
3 + $v4<<3 + $v4.x, 3 + $v4.y, 3 + $v4.z>> と同じです。
float $iv = $v4 * $v5;
ベクトル変数 $v4$v5内積を計算します。
変数 $iv は float になります。
vector $ov = $v1 ^ $v2;
ベクトル変数 $v1$v2外積を計算します。
結果の $ov はベクトルになります。
vector $v7 = $v5 / $v6;
ベクトル変数 $v4$v5 による除算を計算します。
$v5 / $v6<<$v5.x/$v6.x, $v5.y/$v6.y, $v5.z/$v6.z>> と同じです。
if($v7 > <<3, 4, 5>>) print "true\n";
ベクトル変数 $v7 の長さが <<3, 4, 5>> の長さの値より大きければ true を表示します。
if($v7 == <<3, 4, 5>>) print "true\n";
ベクトル変数 $v7 の X 成分が 3、Y 成分が 4、Z 成分が 5 に等しければ true を表示します。

練習

参考


Prev
Home | Contents
Mail