バーチャルキャスト公式Wiki
メニュー
Steam版
デバイス
アセット
配信
その他
リリース情報
- wiki編集者用ページ
-
以前のリビジョンの文書です
QuaternionはX,Y,Z,Wの4つの値を持ったクラスです。
回転を表現するクラスですが、値を直接指定してQuaternionを直接変化させる事はありません。
基本的に、変化させたい場合は下記にあげるメソッドを使用して変化させます。
メソッド一覧は[EmbeddedScriptWorkspace]フォルダ内の[types.lua]を開くと最新のメソッド一覧を確認できます。
表記の省略の為、Vector3型
は Vec3
、number型
は num
と表記してあります。
引数は ()
の中に、戻り値の型は :(セミコロン)
の後に表記してあります。
メソッド名 | 説明 |
---|---|
_new fun(x: num, y: num, z: num, w: num): Quaternion | 初期化 |
FromToRotation fun(fromDirection: Vec3, toDirection: Vec3): Quaternion | fromDirectionの方向から、toDirectionの方向へ回転します。 |
Inverse fun(rotation: Quaternion): Quaternion | rotationと逆のQuaternionを作成します。 |
Slerp fun(a: Quaternion, b: Quaternion, t: num): Quaternion | a と b の間を t で球面補間します。t は[0, 1]の範囲です。 |
SlerpUnclamped fun(a: Quaternion, b: Quaternion, t: num): Quaternion | Slerpと同じですが、t の値を[0, 1]に制限しません。バネ等に使います。 |
Lerp fun(a: Quaternion, b: Quaternion, t: num): Quaternion | a と b の間を t で線形補間します。t は[0, 1]の範囲です。 |
LerpUnclamped fun(a: Quaternion, b: Quaternion, t: num): Quaternion | Lerpと同じですが、t の値を[0, 1]に制限しません。バネ等に使います。 |
AngleAxis fun(angle: num, axis: Vec3): Quaternion | axisのベクトルを軸にして、angle度回転する回転を作成 |
LookRotation fun(forward: Vec3, upwards: Vec3): Quaternion | 前方向のforwardと、上方向のupwardsに対応する方向に向きます。 |
Dot fun(a: Quaternion, b: Quaternion): num | 2の回転 a と b の内積を返します。 |
Angle fun(a: Quaternion, b: Quaternion): num | 2つの回転 a と b の角度を返します。 |
Euler fun(x: num, y: num, z: num): Quaternion | オイラー角で指定してQuaternionを作成します。 |
ToAngleAxis fun(angle: usertype, axis: usertype) | ※現在使用することが出来ません。回転を座標に対する角度の値 (AngleAxis) に変換します。 |
RotateTowards fun(from: Quaternion, to: Quaternion, maxDegreesDelta: num): Quaternion | 2つのQuaternion間の最大となる回転を補間します。 |
Normalize fun(q: Quaternion): Quaternion | qのノルムを1にし、単位Quaternionを返します。引数なしで四元数quatのメソッドとして使った場合(例:quat.Normalize())、オブジェクト側(quat)の値の変更がなされます。 |
GetHashCode fun(): num | 使用しません。 |
ToString fun(): string | 文字列に変換します |
ToEuler fun(): Vec3 | ToEuler()は非推奨です。オイラー角に変換する場合は'eulerAngles'が推奨されます。単位はラジアンで返します。 |
ToEulerAngles fun(): Vec3 | ToEuler()と同じくToEulerAngles()は非推奨です。オイラー角に変換する場合は'eulerAngles'が推奨されます。単位はToEuler()と同じくラジアンで返します。 |
identity Quaternion | (0.0, 0.0, 0.0, 1.0)の基準となるQuaternionを作成します。 |
eulerAngles Vec3 | 回転をオイラー角の値で返します。 |
normalized Quaternion | 単位Quaternionを返します。値の変更はされません。 |
x num | 基本的に直接Quaternionを変更しません |
y num | 基本的に直接Quaternionを変更しません |
z num | 基本的に直接Quaternionを変更しません |
w num | 基本的に直接Quaternionを変更しません |
kEpsilon num |
サンプル
rotate = Quaternion.identity print(rotate)
実行結果
(0.0, 0.0, 0.0, 1.0)
基本的にQuaternion.identity
でQuaternionを初期化します。
__new()
でも宣言可能ですが、Quaternionを直接扱う事は少ないです。
また、上記のサンプルではrotate.x = 1
とする事で、各要素に対して直接アクセス可能ですが、Quaternionを操作する際は用意されたメソッドを使い操作する事を推奨します。
サンプル
--SunItemのゲームオブジェクト名とGetTransform("")の("")の中を一致させる必要があります。 Subitem = vci.assets.GetTransform("Subitem") function onUngrab() local rotate = Quaternion.identity local velocity = Vector3.zero Subitem.SetLocalRotation(rotate) Subitem.SetVelocity(velocity) end
実行結果
(VCIを掴んだ状態から離すと、回転(Rotation)が初期状態(x = 0, y = 0, z = 0)になります。)
SetLocalRotation()
を使う事で、作成したQuaternionの姿勢にする事ができます。
その際は、姿勢を変更した後にSetVelocity()
を0にする事で、rigidbodyによる姿勢の更新を防ぎます。
FromToRotation fun(fromDirection: Vec3, toDirection: Vec3): Quaternion
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() local Vec1 = Subitem.GetUp(); local Vec2 = Subitem2.GetPosition() - Subitem.GetPosition(); local Rot1 = Subitem.GetRotation(); local Rot2 = Quaternion.FromToRotation(Vec1, Vec2); local Rot3 = Rot2*Rot1; Subitem.SetRotation(Rot3); end
実行結果
Subitemの上面(up)が常にSubitem2の方向を向きます。 ただし、LookRotationを使った方が安定します。
説明
Quaternion.FromToRotationは、2つのベクトルの差分をQuaternionで返します。
Inverse fun(rotation: Quaternion): Quaternion
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() Subitem.SetRotation(Quaternion.Inverse(Subitem2.GetRotation())); end
実行結果
Subitemが常にSubitem2と逆に回転します。
説明
Quaternion.Inverseは、逆のQuaternionを作成します。
Slerp fun(a: Quaternion, b: Quaternion, t: num): Quaternion
サンプル1
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() -- time [0,1] local time = 0.5 * math.sin(os.time()) + 0.5 local rotate = Quaternion.identity Subitem.SetRotation(Quaternion.Slerp(rotate, Subitem2.GetRotation(), time)); end
実行結果
Subitemが(0,0,0,1)からSubitem2の角度へ球面補間を行って往復回転します。
サンプル2
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() Subitem.SetRotation(Quaternion.Slerp(Subitem.GetRotation(), Subitem2.GetRotation(), 0.01)); end
実行結果
SubitemがSubitem2の角度へゆっくり回転します。
説明
Quaternion.Slerpは、第一引数 と 第二引数 の間を 第三引数の値 で球面補間します。第三引数の値 は[0, 1]の範囲です。
SlerpUnclamped fun(a: Quaternion, b: Quaternion, t: num): Quaternion
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() -- time [0,2] local time = math.sin(os.time()) + 1 local rotate = Quaternion.identity Subitem.SetRotation(Quaternion.SlerpUnclamped(rotate, Subitem2.GetRotation(), time)); end
実行結果
Subitemが(0,0,0,1)からSubitem2の角度を通り越して球面補間を行って往復回転します。
説明
Slerpと同じですが、第三引数 の値を[0, 1]に制限しません。
Lerp fun(a: Quaternion, b: Quaternion, t: num): Quaternion
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() -- time [0,1] local time = 0.5 * math.sin(os.time()) + 0.5 local rotate = Quaternion.identity Subitem.SetRotation(Quaternion.Lerp(rotate, Subitem2.GetRotation(), time)); end
実行結果
Subitemが(0,0,0,1)からSubitem2の角度へ線形補間を行って往復回転します。
説明
Quaternion.Lerpは、第一引数 と 第二引数 の間を 第三引数の値 で線形補間します。第三引数の値 は[0, 1]の範囲です。
サンプル2
--SunItemのゲームオブジェクト名とGetTransform("")の("")の中を一致させる必要があります。 Subitem = vci.assets.GetTransform("Subitem") base = Quaternion.identity target = Quaternion.Euler(0, 90, 0) function update() local time = math.abs(math.sin((vci.me.FrameCount / 60))) local lerp = Quaternion.Lerp(base, target, time) Subitem.SetRotation(lerp) end
実行結果
(Subitemがゆっくりと振幅するように90度回転します。)
説明
基準となるQuaternionと、ターゲットになるQuaternionの中間を補間するQuaternionを作成します。
0-1の値で指定すると指定した値の%に応じたQuaternionが返ってきます。
ゆっくりと値を変化させることで、特定の姿勢から特定の姿勢にゆっくりと変化します。
LerpUnclamped fun(a: Quaternion, b: Quaternion, t: num): Quaternion
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() -- time [0,2] local time = math.sin(os.time()) + 1 local rotate = Quaternion.identity Subitem.SetRotation(Quaternion.LerpUnclamped(rotate, Subitem2.GetRotation(), time)); end
実行結果
Subitemが(0,0,0,1)からSubitem2の角度を通り越して線形補間を行って往復回転します。
説明
Lerpと同じですが、第三引数 の値を[0, 1]に制限しません。
AngleAxis fun(angle: number, axis: Vector3): Quaternion
サンプル
--SunItemのゲームオブジェクト名とGetTransform("")の("")の中を一致させる必要があります。 local _subitem = vci.assets.GetTransform("Subitem") local _angle = 0 function onUse() _angle = _angle + 10 if _angle > 360 then _angle = 0 end print("angle : ".._angle) local axis = Vector3.up local rotate = Quaternion.AngleAxis(_angle, axis) Subitem.SetRotation(rotate) end
実行結果
(VCIをUseすると10度づつ回転します)
Vector3で方向を指定してその方向を回転の軸とし、angleの値だけ回転させます。
サンプルではaxis = Vector3.up
で下から上に向かった軸を作成して回転させています。
angleは0~360の値で指定します。
LookRotation fun(forward: Vector3, upwards: Vector3): Quaternion
サンプル1
function onUngrab(target) local forward = vci.assets.GetTransform(target).GetForward() local up = vci.assets.GetTransform(target).GetUp() local rotate = Quaternion.LookRotation(forward, up) print(rotate) print(vci.assets.GetTransform(target).GetRotation()) end
実行結果
(0.0, -0.3, -0.1, 1.0) (0.0, -0.3, -0.1, 1.0) (0.0, 0.9, 0.0, 0.4) (0.0, 0.9, 0.0, 0.4)
説明
upのベクトルと、forwardのベクトルを使用して、Quaternionを作成します。
サンプルではrotate
とvci.assets.GetTransform(target).GetRotation()
は同じ値をとります。
サンプル2
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() local Vec = Subitem2.GetPosition() - Subitem.GetPosition(); Subitem.SetRotation(Quaternion.LookRotation(Vec)); end
実行結果
Subitemが常にSubitem2の方を向きます。
Dot fun(a: Quaternion, b: Quaternion): number
サンプル
function onUngrab(target) local rotate = vci.assets.GetTransform(target).GetRotation() local base = Quaternion.identity print(Quaternion.Dot(rotate, base)) end
実行結果
0.886427819728851 -0.289039075374603 (VCIを手から離した時に、掴んだアイテムとbaseとの内積をとります)
2つのQuaternionを比較して、その内積をとります。
戻り値は-1~1
の間になります。
Angle fun(a: Quaternion, b: Quaternion): number
サンプル
function onUse(use) local base = Quaternion.Euler(0, 10, 0) local target = Quaternion.Euler(0, 135, 0) print(Quaternion.Angle(base, target)); end
実行結果
(125)
説明
第一引数 と 第二引数 の角度を返します。
Euler fun(x: number, y: number, z: number): Quaternion
サンプル
---SunItemのゲームオブジェクト名とGetTransform("")の("")の中を一致させる必要があります。 Subitem = vci.assets.GetTransform("Subitem") function onUngrab() local rotate = Quaternion.Euler(30, 45, 60) local velocity = Vector3.zero Subitem.SetLocalRotation(rotate) Subitem.SetVelocity(velocity) end
実行結果
(VCIを掴んだ状態から離すと、回転(Rotation)が(x = 30, y = 45, z = 60)になります。)
回転をオイラー角(0°~360°)の値で指定し、Quaternionを作成します。
要素の指定は前から X → Y → Z の順に行います。
ToAngleAxis fun(angle: usertype, axis: usertype)
サンプル
function onUse(use) local rotate = Quaternion.AngleAxis(30.0, Vector3.up) local angle = 0 local axis = Vector3.zero print(rotate) rotate.ToAngleAxis(angle, axis) print(angle) print(axis) end
実行結果
現在ToAngleAxisを使用することができません。
RotateTowards fun(from: Quaternion, to: Quaternion, maxDegreesDelta: num): Quaternion
サンプル
local Subitem = vci.assets.GetTransform("Subitem") local Subitem2 = vci.assets.GetTransform("Subitem2") function updateAll() local move = Quaternion.RotateTowards(Subitem.GetRotation(), Subitem2.GetRotation(), 0.25,0) Subitem.SetRotation(move) end
実行結果
Subitemの回転がSubitem2の角度と同じになるように毎フレーム0.25度ずつ回転します
説明
2つのQuaternion間の最大となる回転を補間します。
Normalize fun(q: Quaternion): Quaternion
サンプル
function onUse(use) local zero = Quaternion.identity local rotate = Quaternion.Euler(0, 280, 180) rotate.x = 2 print(rotate) print(Quaternion.Normalize(rotate)) end
実行結果
(2.0, 0.0, -0.8, 0.0) (0.9, 0.0, -0.4, 0.0)
説明
qのノルムを1にし、単位Quaternionを返します。引数なしで四元数quatのメソッドとして使った場合(例:quat.Normalize())、オブジェクト側(quat)の値の変更がなされます。
ToString fun(): string
サンプル
function onUse(use) local rotate = Quaternion.identity print(rotate.ToString()) end
実行結果
"(0.0, 0.0, 0.0, 1.0)"
説明
文字列に変換します。
ToEuler fun(): Vec3
サンプル
function onUse(use) local rotate = Quaternion.Euler(60, 270, 30) print(rotate) print(rotate.ToEuler()*180/3.14159265359) end
実行結果
(60, -90, 30)
説明
ToEuler()は非推奨です。オイラー角に変換する場合は'eulerAngles'が推奨されます。
-πrad ~ πradの範囲で値を返します。
ToEulerAngles fun(): Vec3
サンプル
function onUse(use) local rotate = Quaternion.Euler(60, 270, 30) print(rotate) print(rotate.ToEulerAngles()*180/3.14159265359) end
実行結果
(60, -90, 30)
説明
ToEulerAngles()は非推奨です。オイラー角に変換する場合は'eulerAngles'が推奨されます。
-πrad ~ πradの範囲で値を返します。
identity Quaternion
サンプル
rotate = Quaternion.identity print(rotate)
実行結果
(0.0, 0.0, 0.0, 1.0)
基本的にQuaternion.identityでQuaternionを初期化します。
eulerAngles Vector3
サンプル
euler = Quaternion.Euler(30, 45, 60) print(euler) print(euler.eulerAngles) print(euler.eulerAngles.x) print(euler.eulerAngles.y) print(euler.eulerAngles.z)
実行結果
(0.4, 0.2, 0.4, 0.8) (30.0, 45.0, 60.0) 30.0000019073486 45 60.0000038146973
Quaternionの値をオイラー角の値で返します。
eulerAngles.
の後にアクセスしたい要素を指定する事で個別にアクセスする事も可能です。
normalized Quaternion
サンプル
function onUse(use) local rotate = Quaternion.Euler(0, 280, 180) rotate.x = 2 print(rotate) print(rotate.normalized) end
実行結果
(2.0, 0.0, -0.8, 0.0) (0.9, 0.0, -0.4, 0.0)
説明
単位Quaternionを返します。