~~NOTOC~~ ====== Vector3 ====== このページは過去の情報となります。\\ 新しいスクリプトリファレンスは**[[https://developer.virtualcast.jp/vci-docs/api/|こちら]]**になります。 Vector3はX,Y,Zの3つの値を持ったクラスです。\\ 位置や力の方向を表したりするのに使います。 ^ 名前 ^ 説明 ^ バージョン ^ | [[vci/script/reference/vector3#Slerp ]] | 2つのベクトル間を t で球面補間します。t は[0, 1]の範囲です。 | | [[vci/script/reference/vector3#SlerpUnclamped ]] | Slerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。 | | [[vci/script/reference/vector3#OrthoNormalize ]] | 正規化したベクトル、直交ベクトル、外積を作成します。 | | [[vci/script/reference/vector3#RotateTowards ]] | currentの向きから、targetの向きまで回転させます。ただし、その際の最大速度はmaxRadiansDelta m/secに制限されます。 | | [[vci/script/reference/vector3#Lerp ]] | 2つのベクトル間を t で線形補間します。t は[0, 1]の範囲です。 | | [[vci/script/reference/vector3#LerpUnclamped ]] | Lerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。 | | [[vci/script/reference/vector3#MoveTowards ]] | currentの位置から、targetの位置まで移動させます。ただし、その際の最大速度はmaxDistanceDelta m/secに制限されます。 | | [[vci/script/reference/vector3#SmoothDamp ]] | 目的地に向かって時間の経過とともに徐々にベクトルを変化させます。 | | [[vci/script/reference/vector3#set_Item ]] | Vector3の値をvalueで上書きします。index 0 = x, 1 = y, 2 = z | | [[vci/script/reference/vector3#Set ]] | Vector3の値を上書きします。 | | [[vci/script/reference/vector3#Scale ]] | 2つのベクトルの各成分を乗算します。 | | [[vci/script/reference/vector3#Cross ]] | 2つのベクトルの外積を計算します。 | | [[vci/script/reference/vector3#GetHashCode ]] | ハッシュ値を求めます。 | | [[vci/script/reference/vector3#Reflect ]] | inDirectionで指定したベクトルをinNormalで反射させます。 | | [[vci/script/reference/vector3#Normalize ]] | ベクトルを正規化して単位ベクトルにします。 | | [[vci/script/reference/vector3#Dot ]] | 2つのベクトルの内積を計算します。\\ | | [[vci/script/reference/vector3#Project ]] | onNormalを基準としvectorを投影した時のベクトルを求めます。 | | [[vci/script/reference/vector3#ProjectOnPlane ]] | planeNormalを法線ベクトルとする面へのvectorベクトルの投影ベクトルを求めます。 | | [[vci/script/reference/vector3#Angle ]] | from,toの2つのベクトルが張る角度を度数法で返す。 | | [[vci/script/reference/vector3#SignedAngle ]] | fromベクトルとtoベクトルの間の角度を符号付きで返します。正負はaxisの方向によって決定されます。 | | [[vci/script/reference/vector3#Distance ]] | aとb、2点間の距離を計算します。 ※(a-b).magnitudeと同じ処理 | | [[vci/script/reference/vector3#ClampMagnitude ]] | vectorの長さを最大maxLengthに制限します。vectorの長さがmaxLength以下の場合そのまま返します。maxLength以上の場合は方向はそのまま長さがmaxLengthになるように規格化します。 | | [[vci/script/reference/vector3#Magnitude ]] | ベクトルの長さを求めます。 | | [[vci/script/reference/vector3#SqrMagnitude ]] | ベクトルを二乗の長さを求めます。 | | [[vci/script/reference/vector3#Min / Max |Min ]] | 2つのベクトルの各成分を比較して、最小の値でベクトルを作成します。 | | [[vci/script/reference/vector3#Min / Max |Max ]] | 2つのベクトルの各成分を比較して、最大の値でベクトルを作成します。 | | [[vci/script/reference/vector3#ToString ]] | 文字列に変換します | | [[vci/script/reference/vector3#AngleBetween ]] | 単位がラジアンのAngle。fromとtoとの間の角度をラジアンで返します。符号は付きません。 | | Exclude(非推奨) | ProjectOnPlaneと同じです。([[https://answers.unity.com/questions/25110/what-is-vector3exclude-for.html|unity4.6より非推奨のようです。]]ProjectOnPlaneを使用してください。) | | [[vci/script/reference/vector3#normalized ]] | ベクトルの正規化を行います。(読み取り専用) | | [[vci/script/reference/vector3#magnitude(num) ]] | ベクトルを長さとして読み取ります。 | | [[vci/script/reference/vector3#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 | ''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軸方向が前後 となるベクトルです。\\ 例えば、[[vci:script:reference:exporttransform|ExportTransform]]のSetVelocity()を使ってVector3.forwardをSubItemのに加えれば、Z軸の方向に向かって移動します。 ==== fwd, negativeInfinity, positiveInfinity ==== サンプル\\ 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 ==== local Subitem = vci.assets.GetTransform("Subitem") function onUse(use) itempos = SubItem.GetLocalPosition() print(itempos.kEpsilon) end \\ 実行結果\\ (Vector3.kEpsilonで使用する) 9099999974737875E-06 ==== x y z の各要素へのアクセス ==== サンプル\\ 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** サンプル\\ 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** サンプル\\ 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)** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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)** サンプル\\ 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)** サンプル\\ 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)** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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 ===== **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 ===== **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 ===== **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 ===== **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 ===== **Magnitude (vector: Vec3): num** サンプル\\ function onUse(use) local Pos = Vector3.__new(3,0,4) print(Vector3.Magnitude(Pos)) end 実行結果\\ 5 説明\\ ベクトルの長さを求めます。 ===== SqrMagnitude ===== **SqrMagnitude (vector: Vec3): num** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ 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** サンプル\\ function onUse(use) local vec3 = Vector3.__new(3, 4, 0) print(vec3) print(vec3.magnitude) end 実行結果\\ 5 説明\\ ベクトルを長さとして読み取ります。 ===== sqrMagnitude(num) ===== **sqrMagnitude: num** サンプル\\ function onUse(use) local vec3 = Vector3.__new(3, 4, 0) print(vec3) print(vec3.sqrMagnitude) end 実行結果\\ 25 説明\\ ベクトルを二乗の長さとして読み取ります。