Vector3

このページは過去の情報となります。
新しいスクリプトリファレンスはこちらになります。

Vector3はX,Y,Zの3つの値を持ったクラスです。
位置や力の方向を表したりするのに使います。

名前 説明 バージョン
Slerp 2つのベクトル間を t で球面補間します。t は[0, 1]の範囲です。
SlerpUnclamped Slerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。
OrthoNormalize 正規化したベクトル、直交ベクトル、外積を作成します。
RotateTowards currentの向きから、targetの向きまで回転させます。ただし、その際の最大速度はmaxRadiansDelta m/secに制限されます。
Lerp 2つのベクトル間を t で線形補間します。t は[0, 1]の範囲です。
LerpUnclamped Lerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。
MoveTowards currentの位置から、targetの位置まで移動させます。ただし、その際の最大速度はmaxDistanceDelta m/secに制限されます。
SmoothDamp 目的地に向かって時間の経過とともに徐々にベクトルを変化させます。
set_Item Vector3の値をvalueで上書きします。index 0 = x, 1 = y, 2 = z
Set Vector3の値を上書きします。
Scale 2つのベクトルの各成分を乗算します。
Cross 2つのベクトルの外積を計算します。
GetHashCode ハッシュ値を求めます。
Reflect inDirectionで指定したベクトルをinNormalで反射させます。
Normalize ベクトルを正規化して単位ベクトルにします。
Dot 2つのベクトルの内積を計算します。
Project onNormalを基準としvectorを投影した時のベクトルを求めます。
ProjectOnPlane planeNormalを法線ベクトルとする面へのvectorベクトルの投影ベクトルを求めます。
Angle from,toの2つのベクトルが張る角度を度数法で返す。
SignedAngle fromベクトルとtoベクトルの間の角度を符号付きで返します。正負はaxisの方向によって決定されます。
Distance aとb、2点間の距離を計算します。 ※(a-b).magnitudeと同じ処理
ClampMagnitude vectorの長さを最大maxLengthに制限します。vectorの長さがmaxLength以下の場合そのまま返します。maxLength以上の場合は方向はそのまま長さがmaxLengthになるように規格化します。
Magnitude ベクトルの長さを求めます。
SqrMagnitude ベクトルを二乗の長さを求めます。
Min 2つのベクトルの各成分を比較して、最小の値でベクトルを作成します。
Max 2つのベクトルの各成分を比較して、最大の値でベクトルを作成します。
ToString 文字列に変換します
AngleBetween 単位がラジアンのAngle。fromとtoとの間の角度をラジアンで返します。符号は付きません。
Exclude(非推奨) ProjectOnPlaneと同じです。(unity4.6より非推奨のようです。ProjectOnPlaneを使用してください。)
normalized ベクトルの正規化を行います。(読み取り専用)
magnitude(num) ベクトルを長さとして読み取ります。
sqrmagnitude(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 Vec3x のみにアクセスします
y: num Vec3y のみにアクセスします
z: num Vec3z のみにアクセスします

サンプル

main.lua
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のあとにzerooneという形で指定する事も可能です。
数値はnumber型 となり、内部的には浮動小数点となります。

初期化タイプ一覧

サンプル

main.lua
    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軸の方向に向かって移動します。

fwd, negativeInfinity, positiveInfinity

サンプル

main.lua
    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 と同じ意味です。

kEpsilon

main.lua
local Subitem = vci.assets.GetTransform("Subitem")
 
function onUse(use)
    itempos = SubItem.GetLocalPosition()
    print(itempos.kEpsilon)
end


実行結果

(Vector3.kEpsilonで使用する)
9099999974737875E-06

x y z の各要素へのアクセス

サンプル

main.lua
    local pos = Vector3.__new(1,1,1)
    pos.x = pos.x + 1
    pos.y = pos.y + 2
    pos.z = pos.z + 3
    print(pos.x)
    print(pos.y)
    print(pos.z)

実行結果

2
3
4

Vector3の各要素へ個別にアクセスする場合は、変数の末尾にアクセスしたい要素を指定します。
変数名.アクセスしたい要素 と書きます。

Slerp

Slerp (a: Vec3, b: Vec3, t: num): Vec3

サンプル

main.lua
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

SlerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3

サンプル

main.lua
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

OrthoNormalize (normal: usertype, tangent: usertype)

サンプル

main.lua
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

RotateTowards (current, target, maxRadiansDelta, maxMagnitudeDelta): Vec3

サンプル

main.lua
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

Lerp (a: Vec3, b: Vec3, t: num): Vec3

サンプル

main.lua
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

LerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3

サンプル

main.lua
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

MoveTowards (current: Vec3, target: Vec3, maxDistanceDelta: num): Vec3

サンプル

main.lua
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

SmoothDamp (current: Vec3, target: Vec3, currentVelocity: usertype, smoothTime: num, maxSpeed: num, deltaTime: num): (Vec3, Vec3)

サンプル

main.lua
local target = vci.assets.GetTransform("target")
local mover = vci.assets.GetTransform("mover")
local velocity = Vector3.zero
local prevTime = os.time()
 
function update()
    local time = os.time()
    local deltaTime = time - prevTime;
    prevTime = time
 
    local position
    position, velocity = Vector3.SmoothDamp(mover.GetPosition(), target.GetPosition(), velocity, 1.0, math.huge, deltaTime)
 
    mover.SetPosition(position)
end

実行結果

"mover""target"に向かって動きます。

説明
目的地に向かって時間の経過とともに徐々にベクトルを変化させます。

set_Item

set_Item (index: num, value: num)

サンプル

main.lua
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

Set (newX: num, newY: num, newZ: num)

サンプル

main.lua
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

Scale (a: Vec3, b: Vec3): Vec3

サンプル

main.lua
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

Cross (lhs: Vec3, rhs: Vec3): Vec3

サンプル

main.lua
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

GetHashCode (): num

サンプル

main.lua
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

Reflect (inDirection: Vec3, inNormal: Vec3): Vec3

サンプル

main.lua
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

Normalize (value: Vec3): Vec3

サンプル

main.lua
    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

Dot (lhs: Vec3, rhs: Vec3): num

サンプル

main.lua
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

Project (vector: Vec3, onNormal: Vec3): Vec3

サンプル

main.lua
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

ProjectOnPlane (vector: Vec3, planeNormal: Vec3): Vec3

サンプル

main.lua
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

main.lua
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

Angle (from: Vec3, to: Vec3): num

サンプル

main.lua
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

SignedAngle (from: Vec3, to: Vec3, axis: Vec3): num

サンプル

main.lua
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

Distance (a: Vec3, b: Vec3): num

サンプル

main.lua
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

ClampMagnitude (vector: Vec3, maxLength: num): Vec3

サンプル

main.lua
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

Magnitude (vector: Vec3): num

サンプル

main.lua
function onUse(use)
    local Pos = Vector3.__new(3,0,4)
    print(Vector3.Magnitude(Pos))
end

実行結果

5

説明
ベクトルの長さを求めます。

SqrMagnitude

SqrMagnitude (vector: Vec3): num

サンプル

main.lua
function onUse(use)
    local Pos = Vector3.__new(3,0,4)
    print(Vector3.SqrMagnitude(Pos))
end

実行結果

25

説明
ベクトルを二乗の長さを求めます。

Min / Max

Min (lhs: Vec3, rhs: Vec3): Vec3
Max (lhs: Vec3, rhs: Vec3): Vec3

サンプル

main.lua
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

ToString (): string

サンプル

main.lua
local Subitem = vci.assets.GetTransform("Subitem")
 
function onUse(use)
    local itemPos = Subitem.GetPosition()
    print(itemPos.ToString())
end

実行結果

"(1.0, 1.0, 1.0)"

説明
文字列に変換します。

AngleBetween

AngleBetween (from: Vec3, to: Vec3): num

サンプル

main.lua
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

normalized: Vec3

サンプル

main.lua
    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)

magnitude: num

サンプル

main.lua
function onUse(use)
    local vec3 = Vector3.__new(3, 4, 0)
    print(vec3)
    print(vec3.magnitude)
end

実行結果

5

説明
ベクトルを長さとして読み取ります。

sqrMagnitude(num)

sqrMagnitude: num

サンプル

main.lua
function onUse(use)
    local vec3 = Vector3.__new(3, 4, 0)
    print(vec3)
    print(vec3.sqrMagnitude)
end

実行結果

25

説明
ベクトルを二乗の長さとして読み取ります。