バーチャルキャスト公式Wiki
メニュー
Steam版
デバイス
アセット
配信
その他
リリース情報
- wiki編集者用ページ
-
以前のリビジョンの文書です
types.lua を開くと最新のメソッド一覧を確認できます。
Vector3はX,Y,Zの3つの値を持ったクラスです。
位置や力の方向を表したりするのに使います。
メソッド一覧は[EmbeddedScriptWorkspace]フォルダ内の[types.lua]を開くと最新のメソッド一覧を確認できます。
表記の省略の為、Vector3型
は Vec3
、number型
は num
と表記してあります。
引数は ()
の中に、戻り値の型は :(セミコロン)
の後に表記してあります。
メソッド名 | 説明 |
---|---|
_new (x: num, y: num, z: num): Vec3 | 初期化 新しいVector3を宣言する時に使用します |
zero: Vec3 | (0.0, 0.0, 0.0) |
one: Vec3 | (1.0, 1.0, 1.0) |
forward: Vec3 | (0.0, 0.0, 1.0) Z軸プラス |
back: Vec3 | (0.0, 0.0, -1.0) Z軸マイナス |
up: Vec3 | (0.0, 1.0, 0.0) Y軸プラス |
down: Vec3 | (0.0, -1.0, 0.0) Y軸マイナス |
left: Vec3 | (-1.0, 0.0, 0.0) X軸マイナス |
right: Vec3 | (1.0, 0.0, 0.0) X軸プラス |
positiveInfinity: Vec3 | (Infinity, Infinity, Infinity) |
negativeInfinity: Vec3 | (-Infinity, -Infinity, -Infinity) |
fwd: Vec3 | (0.0, 0.0, 1.0) Z軸プラス(forwardと同じ) |
kEpsilon: num | |
kEpsilonNormalSqrt: num | |
x: num | Vec3 の x のみにアクセスします |
y: num | Vec3 の y のみにアクセスします |
z: num | Vec3 の z のみにアクセスします |
サンプル
local pos = Vector3.__new(1,1,1) local zero = Vector3.zero local one = Vector3.one print(pos) print(zero) print(one)
実行結果
(1.0, 1.0, 1.0) (0.0, 0.0, 0.0) (1.0, 1.0, 1.0)
説明
VCIスクリプトでVector3を初期化する時は上記にようにnewを使用しいます。
また、Vector3
のあとにzero
やone
という形で指定する事も可能です。
数値はnumber型 となり、内部的には浮動小数点となります。
サンプル
local zero = Vector3.zero print(zero) local one = Vector3.one print(one) local forward = Vector3.forward print(forward) local back = Vector3.back print(back) local up = Vector3.up print(up) local down = Vector3.down print(down) local left = Vector3.left print(left) local right = Vector3.right print(right)
実行結果
(0.0, 0.0, 0.0) (1.0, 1.0, 1.0) (0.0, 0.0, 1.0) (0.0, 0.0, -1.0) (0.0, 1.0, 0.0) (0.0, -1.0, 0.0) (-1.0, 0.0, 0.0) (1.0, 0.0, 0.0)
説明
X軸方向が左右 Y軸方向が上下 Z軸方向が前後 となるベクトルです。
例えば、ExportTransformのSetVelocity()を使ってVector3.forwardをSubItemのに加えれば、Z軸の方向に向かって移動します。
サンプル
local fwd = Vector3.fwd print(fwd) local negativeInfinity = Vector3.negativeInfinity print(negativeInfinity) local positiveInfinity = Vector3.positiveInfinity print(positiveInfinity)
実行結果
(0.0, 0.0, 1.0) (-Infinity, -Infinity, -Infinity) (Infinity, Infinity, Infinity)
説明
Infinityは無限を表します。AddForceで利用すると、目に見えない速度で飛んでいきます。
Vector3.fwd は Vector3.forward と同じ意味です。
local Subitem = vci.assets.GetTransform("Subitem") function onUse(use) itempos = SubItem.GetLocalPosition() print(itempos.kEpsilon) end
実行結果
(Vector3.kEpsilonで使用する) 9099999974737875E-06
サンプル
local pos = Vector3.__new(1,1,1) pos.x = pos.x + 1 pos.x = pos.y + 2 pos.x = pos.z + 3 print(pos.x) print(pos.y) print(pos.z)
実行結果
2 3 4
Vector3の各要素へ個別にアクセスする場合は、変数の末尾にアクセスしたい要素を指定します。
変数名.アクセスしたい要素 と書きます。
Slerp (a: Vec3, b: Vec3, t: num): Vec3
サンプル
function updateAll() -- time [0,1] local time = 0.5 * math.sin(os.time()) + 0.5 local pos = Vector3.Slerp(Vector3.up, Vector3.down, time) vci.assets.GetTransform("Subitem").SetLocalPosition(pos) end
実行結果
座標(0,1,0)から座標(0,-1,0)へ球面補間を行って往復移動します。
説明
2つのベクトル間を t で球面補間します。t は[0, 1]の範囲です。
SlerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3
サンプル
function updateAll() -- time [0,2] local time = math.sin(os.time()) + 1 local pos = Vector3.SlerpUnclamped(Vector3.up, Vector3.down, time) vci.assets.GetTransform("Subitem").SetLocalPosition(pos) end
実行結果
座標(0,1,0)から座標(0,-1,0)を通って1周球面補間を行って往復移動します。
説明
Slerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。
OrthoNormalize (normal: usertype, tangent: usertype)
サンプル
function onUse(use) local vecfo2 = Vector3.forward * 2 local orthogonal = Vector3.zero local cross = Vector3.zero print(vecfo2) Vector3.OrthoNormalize(vecfo2, orthogonal, cross) print(vecfo2) print(orthogonal) print(cross) end
実行結果
(0.0, 0.0, 2.0) (0.0, 0.0, 1.0) (0.0, -1.0, 0.0) (1.0, 0.0, 0.0)
説明
正規化したベクトル、直交ベクトル、外積を求めることが出来ます。
RotateTowards (current, target, maxRadiansDelta, maxMagnitudeDelta): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() local dir = Subitem.GetPosition() - Subitem2.GetPosition() local move = Vector3.RotateTowards(Subitem2.GetForward(), dir, 0.001,0) Subitem2.SetRotation(Quaternion.LookRotation(move)) end
実行結果
Subitem2がSubItemの方に「0.001」の速度で向きを変える。
説明
currentの向きから、targetの向きまで回転させます。ただし、その際の最大速度はmaxRadiansDelta m/secに制限されます。
Lerp (a: Vec3, b: Vec3, t: num): Vec3
サンプル
function updateAll() -- time [0,1] local time = 0.5 * math.sin(os.time()) + 0.5 local pos = Vector3.Lerp(Vector3.up, Vector3.down, time) vci.assets.GetTransform("Subitem").SetLocalPosition(pos) end
実行結果
座標(0,1,0)から座標(0,-1,0)へ線形補間を行って往復移動します。
説明
2つのベクトル間を t で線形補間します。t は[0, 1]の範囲です。
LerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3
サンプル
function updateAll() -- time [-1,1] local time = math.sin(os.time()) local pos = Vector3.LerpUnclamped(Vector3.up, Vector3.down, time) vci.assets.GetTransform("Subitem").SetLocalPosition(pos) end
実行結果
座標(0,2,0)から座標(0,-1,0)へ線形補間を行って往復移動します。
説明
Lerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。
MoveTowards (current: Vec3, target: Vec3, maxDistanceDelta: num): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") function updateAll() local target = Vector3.__new(1,1,1) local move = Vector3.MoveTowards(Subitem.GetLocalPosition(), target, 0.01) Subitem.SetLocalPosition(move) end
実行結果
cubeがある位置から座標(1,1,1)へ秒速0.01mで等速直線運動で移動します。\\
説明
currentの位置から、targetの位置まで移動させます。ただし、その際の最大速度はmaxDistanceDelta m/secに制限されます。
SmoothDamp (current: Vec3, target: Vec3, currentVelocity: usertype, smoothTime: num, maxSpeed: num): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") local ver = Vector3.zero function updateAll() local move = Vector3.SmoothDamp(Subitem2.GetPosition(), Subitem.GetPosition(), ver, 1, 1) Subitem2.SetPosition(move) end
実行結果
Subitem2がSubitemに向かって動きます。
説明
目的地に向かって時間の経過とともに徐々にベクトルを変化させます。
set_Item (index: num, value: num)
サンプル
local vect = Vector3.zero function onUse(use) print(vect) vect.set_Item(0,2) print(vect) vect.set_Item(1,4) print(vect) vect.set_Item(2,6) print(vect) end
実行結果
(0.0, 0.0, 0.0) (2.0, 0.0, 0.0) (2.0, 4.0, 0.0) (2.0, 4.0, 6.0)
Vector3の数値を指定することが出来ます。
第一引数に0~2の値を使います。
0 = x, 1 = y, 2 = z
第二引数に指定する数値を入れます。
説明
Vector3の値をvalueで上書きします。index 0 = x, 1 = y, 2 = z
Set (newX: num, newY: num, newZ: num)
サンプル
local vect = Vector3.zero function onUse(use) print(vect) vect.Set(1, 1, 1) print(vect) vect.Set(2, 3, 4) print(vect) end
実行結果
(0.0, 0.0, 0.0) (1.0, 1.0, 1.0) (2.0, 3.0, 4.0)
説明
Vector3の値を上書きします。
Scale (a: Vec3, b: Vec3): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local itemPos = Subitem.GetPosition() local vect_y0 = Vector3.__new(1, 0, 1) local destinationPos = Vector3.Scale(itemPos,vect_y0) print(itemPos) print(destinationPos) Subitem2.SetPosition(destinationPos) end
実行結果
(2.0, 3.0, 4.0) (2.0, 0.0, 4.0) Subitemがある位置のY軸が0の位置にSubitem2が移動する。
説明
2つのベクトルの各成分を乗算します。
Cross (lhs: Vec3, rhs: Vec3): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local owner = vci.studio.GetOwner() function onUse(use) local itemPos = Subitem.GetPosition() local ownerPos = owner.GetPosition() local vect_y0 = Vector3.__new(1, 0, 1) local vector = Vector3.Scale(itemPos - ownerPos, vect_y0) local ownerVec = Vector3.Scale(owner.GetForward(), vect_y0) local axis = Vector3.Cross(ownerVec, Vector3.Normalize(vector)) print(axis) end
実行結果
向いてる方向にSubitemがある場合 (0.0, 0.0, 0.0) 向いてる方向から時計回りに90度回転した先にSubitemがある場合 (0.0, 1.0, 0.0) 向いてる方向から時計回りに180度回転した先にSubitemがある場合 (0.0, 0.0, 0.0) 向いてる方向から時計回りに270度回転した先にSubitemがある場合 (0.0, -1.0, 0.0)
0度~360度の向きを外積を使って-1~1で表現できるようにしています。
説明
2つのベクトルの外積を計算します。
GetHashCode (): num
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local itemPos = Subitem.GetPosition() local item2Pos = Subitem2.GetPosition() print(itemPos) print(itemPos.GetHashCode()) print(item2Pos) print(item2Pos.GetHashCode()) end
実行結果
(-1.0, 1.2, -0.8) -1359839706 (0.6, 1.1, -0.1) 785239771 Subitemの場所を移動してからもう一度 (0.0, 0.0, 0.0) -1356910401 (0.6, 1.1, -0.1) 785239771
説明
Vector3に対してハッシュ値を求めます。
VCIを再読み込みしたり部屋から退出するとハッシュ値が変わります。
Reflect (inDirection: Vec3, inNormal: Vec3): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") function onUse(use) print(Subitem.GetForward()) print(Vector3.Reflect(Subitem.GetForward(), Vector3.up)) end
実行結果
(-0.4, 0.2, 0.3) (-0.4, -0.2, 0.3)
説明
inDirectionで指定したベクトルをinNormalで反射させます。
第一引数に反射させたいベクトル、第二引数に反射させたい面の法線ベクトルを指定します。
Normalize (value: Vec3): Vec3
サンプル
local vec3 = Vector3.__new(0.5,1,2) print(vec3) vec3.Normalize() print(vec3)
実行結果
(0.5, 1.0, 2.0) (0.2, 0.4, 0.9)
説明
ベクトルの正規化を行います。
2つのベクトルを比較する時に、そのままの値では扱いづらいので正規化を行い基準を揃え、単位ベクトルにします。
ベクトルを方向として扱いたい場合、長さを1に揃えて方向のみの要素として扱う必要があります。
Dot (lhs: Vec3, rhs: Vec3): num
サンプル
function onGrab(target) local Subitem = vci.assets.GetTransform("Subitem") local dot = Vector3.Dot(Vector3.up, Subitem.GetUp()) print(dot) end
実行結果
Dotは引数のベクトルを比較した値を返します。\\ 例えばサンプルのdotの値が1に近づけば、Subitemは基本の姿勢に近く、-1に近づくほど逆さまになっている事が分かります。\\ UnityやVCI等においては、姿勢や向きなどを知る方法として使われるかと思います。\\
説明
2つのベクトルの内積を計算します。
Project (vector: Vec3, onNormal: Vec3): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") function onUse(use) local itemPos = Subitem.GetPosition() print(itemPos) print(Vector3.Project(itemPos, Vector3.forward)) end
実行結果
(-1.9, 1.2, -2.2) (0.0, 0,0 -2.2) 第二引数のベクトルと、第一引数のベクトルから第二引数のベクトルの方向に伸ばした線が垂直に交わる位置を返します。\\
説明
onNormalを基準としvectorを投影した時のベクトルを求めます。
ProjectOnPlane (vector: Vec3, planeNormal: Vec3): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") function onUse(use) local itemPos = Subitem.GetPosition() print(itemPos) print(Vector3.ProjectOnPlane(itemPos, Vector3.up)) end
実行結果
(1.0, 2.0, 3.0) (1.0, 0.0, 3.0) Projectと違い、第二引数に法線を使用します。
サンプル2
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local item2Pos = Subitem.GetPosition() local item2Pos = Subitem2.GetPosition() local setPos = Vector3.ProjectOnPlane(itemPos - item2Pos, item2.GetUp()) print(itemPos) print(item2Pos) Subitem.SetPosition(setPos + item2Pos) end
実行結果
(-0.8, 1.1, -1.3) (-1.0, -0.6, 1.1) Subitem2から真上に見たときにSubitemが垂直の位置に見える座標を得ます。\\ 実行するとSubitem2上にSubitemが移動します。\\
説明
planeNormalを法線ベクトルとする面へのvectorベクトルの投影ベクトルを求めます。
Angle (from: Vec3, to: Vec3): num
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local itemPos = Subitem.GetPosition() local item2Pos = Subitem2.GetPosition() print(Vector3.Angle(itemPos, item2Pos)) end
実行結果
7.07201910018921 角度を0から180の間で返す。
説明
from,toの2つのベクトルが張る角度を度数法で返す。
SignedAngle (from: Vec3, to: Vec3, axis: Vec3): num
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local itemPos = Subitem.GetPosition() local item2Pos = Subitem2.GetPosition() print(Vector3.SignedAngle(itemPos, item2Pos, Vector3.up)) end
実行結果
-8.1070910010225
角度を-180から180の間で返す。
Angleと違い、第三引数に軸となるベクトルを用意する必要がある。
説明
fromベクトルとtoベクトルの間の角度を符号付きで返します。正負はaxisの方向によって決定されます。
Distance (a: Vec3, b: Vec3): num
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local item = Subitem.GetPosition() local item2Pos = Subitem2.GetPosition() print(itemPos); print(item2Pos); print(Vector3.Distance(itemPos, item2Pos)); end
実行結果
(1, 1, 1) (1, 1, 5) 4.00000047683716 第一引数と第二引数の距離を求める。
説明
aとb、2点間の距離を計算します。 ※(a-b).magnitudeと同じ処理
ClampMagnitude (vector: Vec3, maxLength: num): Vec3
サンプル
function onUse(use) local Pos = Vector3.__new(0,0,4) print(Vector3.ClampMagnitude(Pos, 3)) print(Vector3.ClampMagnitude(Pos, 5)) end
実行結果
(0, 0, 3) (0, 0, 4) 第一引数のベクトルの長さが第二引数よりも大きい場合は、第二引数の値に丸められる。
説明
vectorの長さを最大maxLengthに制限します。
vectorの長さがmaxLength以下の場合そのまま返します。
maxLength以上の場合は方向はそのまま長さがmaxLengthになるように規格化します。
Magnitude (vector: Vec3): num
サンプル
function onUse(use) local Pos = Vector3.__new(3,0,4) print(Vector3.Magnitude(Pos)) end
実行結果
5
説明
ベクトルの長さを求めます。
SqrMagnitude (vector: Vec3): num
サンプル
function onUse(use) local Pos = Vector3.__new(3,0,4) print(Vector3.SqrMagnitude(Pos)) end
実行結果
25
説明
ベクトルを二乗の長さを求めます。
Min (lhs: Vec3, rhs: Vec3): Vec3
Max (lhs: Vec3, rhs: Vec3): Vec3
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local itemPos = Subitem.GetPosition() local item2Pos = Subitem2.GetPosition() print(Vector3.Min(itemPos, item2Pos)) print(Vector3.Max(itemPos, item2Pos)) end
実行結果
(1.0, 1.0, 1.0) (1.0, 1.0, 5.0)
説明
2つのベクトルの各成分を比較して、最小(Min)、最大(Max)の値でベクトルを作成します。
ToString (): string
サンプル
local Subitem = vci.assets.GetTransform("Subitem") function onUse(use) local itemPos = Subitem.GetPosition() print(itemPos.ToString()) end
実行結果
"(1.0, 1.0, 1.0)"
説明
文字列に変換します。
AngleBetween (from: Vec3, to: Vec3): num
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function onUse(use) local itemPos = Subitem.GetPosition() local item2Pos = Subitem2.GetPosition() print(Vector3.AngleBetween(itemPos, item2CubePos)) end
実行結果
0.987237751483917
説明
単位がラジアンのAngle。fromとtoとの間の角度をラジアンで返します。符号は付きません。
180度 = 3.14159…
normalized: Vec3
サンプル
local vec3 = Vector3.__new(0.5,1,2) print(vec3) print(vec3.normalized) print(vec3)
実行結果
(0.5, 1.0, 2.0) (0.2, 0.4, 0.9) (0.5, 1.0, 2.0)
説明
ベクトルの正規化を行います。
2つのベクトルを比較する時に、そのままの値では扱いづらいので正規化を行い基準を揃え、単位ベクトルにします。
ベクトルを方向として扱いたい場合、長さを1に揃えて方向のみの要素として扱う必要があります。
magnitude: num
サンプル
function onUse(use) local vec3 = Vector3.__new(3, 4, 0) print(vec3) print(vec3.magnitude) end
実行結果
5
説明
ベクトルを長さとして読み取ります。
sqrMagnitude: num
サンプル
function onUse(use) local vec3 = Vector3.__new(3, 4, 0) print(vec3) print(vec3.sqrMagnitude) end
実行結果
25
説明
ベクトルを二乗の長さとして読み取ります。