HeliScriptでアイテムを回転させる【コピペで使えるサンプルコード付き】

:::note info
本記事は、[HeliScriptでリッチなアスレチックワールドを作ろう！【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/private/63e6bbca2bc1f13ed57e)の記事の一部です

VR法人HIKKYのorganization下のQiita/Zenn両方に投稿しております。
:::
## はじめに
アイテムを移動させるコンポーネントは、[HeliScriptでアイテムをまっすぐ動かす【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/items/f171b7af2a9e15dc2139)　や、[HeliScriptでアイテムを反復して動かす【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/private/dfc38371ad0ed7cc034d) で作成したので、今度は、アイテムを回転させるコンポーネントを作っていきます。

Vket Cloudでは、アイテムの回転はUnityなどと同じく、クオータニオン（Quaternion）で表現されています。
HeliScriptでは、[Quaternionクラス](https://vrhikky.github.io/VketCloudSDK_Documents/12.3/hs/hs_struct_quaternion.html)という組み込みクラスとして用意されており、Itemクラスには、[SetQuaternion(Quaternion Rotate)](https://vrhikky.github.io/VketCloudSDK_Documents/12.3/hs/hs_class_item.html#setquaternion) が用意されているため、こちらを使用して時計回りに一定時間で回転させる細長い足場を実装してみます。

また、プロパティとしては、Vector3のオイラー角で1秒間に何度回転するかと、その方向を設定できるようにします。

![2024-04-21 22-10-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/a7375e01-c481-e8a5-e9a1-e363f73cf15c.gif)

**Unity設定画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/5c8f55ea-302e-57fa-3207-ba6a0614aab2.png)

**コード全文**
```C#:ItemRepetitionMove.hs
component ItemRotate
{
    Utility m_UT; //Utilityクラスを宣言する
	Item m_item;
	
	Vector3 m_rotationEuler; //回転スピード
	float m_offset; //回転の開始地点

	Quaternion m_itemInitialQua;
	float m_timeCounter;

	public ItemRotate()
	{
        m_UT = new Utility(); //Utilityクラスを初期化する
		m_item = hsItemGetSelf();

		m_rotationEuler = m_UT.StrToVector3(m_item.GetProperty("rotationEuler(Vector3)"));

        //アイテムが配置された初期回転値を取得しておく
		m_itemInitialQua = m_item.GetQuaternion();
	}

    //毎フレーム呼びだされる
	public void Update()
	{
        RotateItem();
	}

    //アイテムを回転させる
    void RotateItem()
    {
        //このフレームでのdeltaTimeを取得しておく
        float deltaTime = hsSystemGetDeltaTime();

        //Vector3型のそれぞれの要素にdeltaTimeを掛けた、rotationDirectionを格納する
        Vector3 deltaRotationEuler = makeVector3(deltaTime * m_rotationEuler.x, deltaTime * m_rotationEuler.y, deltaTime * m_rotationEuler.z);

        //Quaternionに変換する
        Quaternion deltaRotation = makeQuaternionEuler(deltaRotationEuler.x, deltaRotationEuler.y, deltaRotationEuler.z);

        //今回のフレームで回転する値を求める
        Quaternion currentRotationQua = makeQuaternionMul(m_item.GetQuaternion(), deltaRotation);

        //回転した値を設定する
		m_item.SetQuaternion(currentRotationQua);
    }
}
```
## コード解説

今回もstring型のpropertyを、Vector3に変換するため、前回の記事で作成した、[Utilityクラス](https://qiita.com/IwahanaFuku/private/dfc38371ad0ed7cc034d#%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC)の、`StrToVector3(string str)`を使用しています。


### アイテムを回転させる
```C#
    //アイテムを回転させる
    void RotateItem()
    {
        //このフレームでのdeltaTimeを取得しておく
        float deltaTime = hsSystemGetDeltaTime();

        //Vector3型のそれぞれの要素にdeltaTimeを掛けた、rotationDirectionを格納する
        Vector3 deltaRotationEuler = makeVector3(deltaTime * m_rotationEuler.x, deltaTime * m_rotationEuler.y, deltaTime * m_rotationEuler.z);

        //Quaternionに変換する
        Quaternion deltaRotation = makeQuaternionEuler(deltaRotationEuler.x, deltaRotationEuler.y, deltaRotationEuler.z);

        //今回のフレームで回転する値を求める
        Quaternion currentRotationQua = makeQuaternionMul(m_item.GetQuaternion(), deltaRotation);

        //回転した値を設定する
		m_item.SetQuaternion(currentRotationQua);
    }
 ```

 回転を表現する方法として、オイラー角(Euler)と、クオータニオン（Quaternion)があります。オイラー角はUnity等でよく見るVector3での表現方法です。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/cba885e8-da35-7ff1-e44f-b7addb1fd355.png)

 Propertyとして設定するには、クオータニオンより、オイラー角の方がやりやすいので、[makeQuaternionEuler(float, float, float)](https://vrhikky.github.io/VketCloudSDK_Documents/12.3/hs/hs_struct_quaternion.html#makequaternioneulerfloat-float-float)を使用して、オイラー角をクオータニオンに変換します。

HeliScriptで二つのクオータニオンを合成するには、[makeQuaternionMul(Quaternion, Quaternion)](https://vrhikky.github.io/VketCloudSDK_Documents/12.3/hs/hs_struct_quaternion.html#makequaternionmulquaternion-quaternion)を使用します。


 **前 :** [ワールドを一通り遊べるようにする](https://qiita.com/IwahanaFuku/private/f45059a11c83a367cb6c) 
 **次 :** [HeliScriptで振り子を動かす【コピペで使えるサンプルコード付き】】](https://qiita.com/IwahanaFuku/private/886ff5e61282bf7b611d)