ユーザ用ツール

サイト用ツール


vci:script:reference:quaternion

Quaternion

QuaternionはX,Y,Z,Wの4つの値を持ったクラスです。
回転を表現するクラスですが、値を直接指定してQuaternionを直接変化させる事はありません。
基本的に、変化させたい場合は下記にあげるメソッドを使用して変化させます。


メソッド一覧

メソッド一覧は[EmbeddedScriptWorkspace]フォルダ内の[types.lua]を開くと最新のメソッド一覧を確認できます。
表記の省略の為、Vector3型Vec3number型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
GetHashCode fun(): num 使用しません。
ToString fun(): string
ToEuler fun(): Vec3
ToEulerAngles fun(): Vec3
identity Quaternion (0.0, 0.0, 0.0, 1.0)の基準となるQuaternionを作成します。
eulerAngles Vec3 回転をオイラー角の値で返します。
normalized Quaternion
x num 基本的に直接Quaternionを変更しません
y num 基本的に直接Quaternionを変更しません
z num 基本的に直接Quaternionを変更しません
w num 基本的に直接Quaternionを変更しません
kEpsilon num

初期化について

サンプル

main.lua
rotate = Quaternion.identity
print(rotate)

実行結果

(0.0, 0.0, 0.0, 1.0)

基本的にQuaternion.identityでQuaternionを初期化します。
__new()でも宣言可能ですが、Quaternionを直接扱う事は少ないです。
また、上記のサンプルではrotate.x = 1とする事で、各要素に対して直接アクセス可能ですが、Quaternionを操作する際は用意されたメソッドを使い操作する事を推奨します。

サンプル

main.lua
--SunItemのゲームオブジェクト名とGetSubItem("")の("")の中を一致させる必要があります。
Subitem = vci.assets.GetSubItem("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による姿勢の更新を防ぎます。


Euler()

Euler fun(x: number, y: number, z: number): Quaternion

サンプル

main.lua
---SunItemのゲームオブジェクト名とGetSubItem("")の("")の中を一致させる必要があります。
Subitem = vci.assets.GetSubItem("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 の順に行います。


eulerAngles

eulerAngles Vector3

サンプル

main.lua
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.の後にアクセスしたい要素を指定する事で個別にアクセスする事も可能です。


AxisAngle()

AngleAxis fun(angle: number, axis: Vector3): Quaternion

サンプル

main.lua
--SunItemのゲームオブジェクト名とGetSubItem("")の("")の中を一致させる必要があります。
Subitem = vci.assets.GetSubItem("Subitem")
angle = 0
function onUngrab()
    angle = angle + math.pi / 180
    if angle > (2 * math.pi) then
        angle = 0
    end
    print(angle)
 
    local axis = Vector3.up
    local rotate = Quaternion.AxisAngle(axis, angle)
    Subitem.SetLocalRotation(rotate)
 
    local velocity = Vector3.zero
    Subitem.SetVelocity(velocity)
end

実行結果

(VCIを掴んだ状態から離すと、Y軸の回転(Rotation.y)が1度づつ増えます。)

Vector3で方向を指定してその方向を回転の軸とし、angleの値だけ回転させます。
サンプルではaxis = Vector3.upで下から上に向かった軸を作成して回転させています。
回転角度を指定するangle0~6.28318530718(2π)の値で指定します。
2πを360で割った値は0.01745329251となるので、angleの値に足してゆくと1度づつ回転してゆく処理になります。
Luaでπを表現する場合はmath.piを使用します。


LookRotation()

LookRotation fun(forward: Vector3, upwards: Vector3): Quaternion

サンプル

main.lua
function onUngrab(target)
    local forward = vci.assets.GetSubItem(target).GetForward()
    local up = vci.assets.GetSubItem(target).GetUp()
    local rotate = Quaternion.LookRotation(forward, up)
    print(rotate)
    print(vci.assets.GetSubItem(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を作成します。
サンプルではrotatevci.assets.GetSubItem(target).GetRotation()は同じ値をとります。


Lerp()

Lerp fun(a: Quaternion, b: Quaternion, t: number): Quaternion

サンプル

main.lua
--SunItemのゲームオブジェクト名とGetSubItem("")の("")の中を一致させる必要があります。
Subitem = vci.assets.GetSubItem("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が返ってきます。
ゆっくりと値を変化させることで、特定の姿勢から特定の姿勢にゆっくりと変化します。


Angle()

Angle fun(a: Quaternion, b: Quaternion): number

サンプル

main.lua
 

実行結果

 

説明


Dot

Dot fun(a: Quaternion, b: Quaternion): number

サンプル

main.lua
function onUngrab(target)
    local rotate = vci.assets.GetSubItem(target).GetRotation()
    local base = Quaternion.identity
    print(Quaternion.Dot(rotate, base))
end

実行結果

0.886427819728851
-0.289039075374603
(VCIを手から離した時に、掴んだアイテムとbaseとの内積をとります)

2つのQuaternionを比較して、その内積をとります。
戻り値は-1~1の間になります。


メソッド名

サンプル

main.lua
 

実行結果

 

説明


vci/script/reference/quaternion.txt · 最終更新: 2019/05/25 17:05 by navana

ページ用ツール