ユーザ用ツール

サイト用ツール


vci:script:reference:vector3

Vector3

types.lua を開くと最新のメソッド一覧を確認できます。
Vector3はX,Y,Zの3つの値を持ったクラスです。
位置や力の方向を表したりするのに使います。


メソッド一覧

メソッド一覧は[EmbeddedScriptWorkspace]フォルダ内の[types.lua]を開くと最新のメソッド一覧を確認できます。
表記の省略の為、Vector3型Vec3number型num と表記してあります。
引数は () の中に、戻り値の型は :(セミコロン) の後に表記してあります。

メソッド名 説明
Slerp (a: Vec3, b: Vec3, t: num): Vec3 2つのベクトル間を t で球面補間します。t は[0, 1]の範囲です。
SlerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3 Slerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。
OrthoNormalize (normal: usertype, tangent: usertype)
RotateTowards (current, target, maxRadiansDelta, maxMagnitudeDelta): Vec3
Lerp (a: Vec3, b: Vec3, t: num): Vec3 2つのベクトル間を t で線形補間します。t は[0, 1]の範囲です。
LerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3 Lerpと同じですが t の値を[0, 1]に制限しません。バネ等に使います。
MoveTowards (current: Vec3, target: Vec3, maxDistanceDelta: num): Vec3
SmoothDamp (current: Vec3, target: Vec3, currentVelocity: usertype, smoothTime: num, maxSpeed: num): Vec3 目的地に向かって時間の経過とともに徐々にベクトルを変化させます。
set_Item (index: num, value: num)
Set (newX: num, newY: num, newZ: num)
Scale (a: Vec3, b: Vec3): Vec3 2つのベクトルの各成分を乗算します。
Cross (lhs: Vec3, rhs: Vec3): Vec3 2つのベクトルの外積を計算します。
GetHashCode (): num ハッシュ値を求めます。
Reflect (inDirection: Vec3, inNormal: Vec3): Vec3
Normalize (value: Vec3): Vec3 ベクトルを正規化して単位ベクトルにします。
Dot (lhs: Vec3, rhs: Vec3): num 2つのベクトルの内積を計算します。
引数には正規化した値を入れてください。
Project (vector: Vec3, onNormal: Vec3): Vec3 onNormalを基準としvectorを投影した時のベクトルを求めます。
ProjectOnPlane (vector: Vec3, planeNormal: Vec3): Vec3
Angle (from: Vec3, to: Vec3): num 2点間のベクトルの角度を返す (Dot()の結果をオイラー角として返す)
SignedAngle (from: Vec3, to: Vec3, axis: Vec3): num
Distance (a: Vec3, b: Vec3): num aとb、2点間の距離を計算します。 ※(a-b).magnitudeと同じ処理
ClampMagnitude (vector: Vec3, maxLength: num): Vec3
Magnitude (vector: Vec3): num ベクトルの長さを求めます。
SqrMagnitude (vector: Vec3): num ベクトルを二乗の長さを求めます。
Min (lhs: Vec3, rhs: Vec3): Vec3 2つのベクトルの各成分を比較して、最小の値でベクトルを作成します。
Max (lhs: Vec3, rhs: Vec3): Vec3 2つのベクトルの各成分を比較して、最大の値でベクトルを作成します。
ToString (): string 文字列に変換します
AngleBetween (from: Vec3, to: Vec3): num
Exclude (excludeThis: Vec3, fromThat: Vec3): Vec3
normalized: Vec3 ベクトルの正規化を行います。(読み取り専用)
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軸の方向に向かって移動します。


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

サンプル

main.lua
    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の各要素へ個別にアクセスする場合は、変数の末尾にアクセスしたい要素を指定します。
変数名.アクセスしたい要素 と書きます。


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)

Vector3.fwd は Vector3.forward と同じ意味です。


normalized

サンプル

main.lua
    local vec3 = Vector3.__new(0.5,1,2)
    print(vec3)
    print(vec3.normalized)

実行結果

(0.5, 1.0, 2.0)
(0.2, 0.4, 0.9)

ベクトルの正規化を行います。
2つのベクトルを比較する時に、そのままの値では扱いづらいので正規化を行い基準を揃え、単位ベクトルにします。
ベクトルを方向として扱いたい場合、長さを1に揃えて方向のみの要素として扱う必要があります。


Slerp (球面補間)

サンプル

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.GetSubItem("subitem").SetLocalPosition(pos)
end

実行結果

座標(0,1,0)から座標(0,-1,0)へ球面補間を行って往復移動します。



Lerp (線形補間)

サンプル

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.GetSubItem("subitem").SetLocalPosition(pos)
end

実行結果

座標(0,1,0)から座標(0,-1,0)へ線形補間を行って往復移動します。



Dot (内積)

サンプル

main.lua
function onGrab(target)
    local subitem = vci.assets.GetSubItem(target)
    local dot = Vector3.Dot(Vector3.up, subitem.GetUp())
    print(dot)
end

Dotは引数のベクトルを比較した値を返します。
例えばサンプルのdotの値が1に近づけば、subitemは基本の姿勢に近く、-1に近づくほど逆さまになっている事が分かります。
UnityやVCI等においては、姿勢や向きなどを知る方法として使われるかと思います。


_

サンプル

main.lua
 

実行結果

結果



_

サンプル

main.lua
 

実行結果

結果


vci/script/reference/vector3.txt · 最終更新: 2019/09/20 15:14 by navana

ページ用ツール