【Unity】動画で見るSlerp

Vector3のSLerpを動画にしました。
SLerpをなんとなく使っている人に見ていただけると幸いです。
[動画で見るLerp](https://qiita.com/TANUKEINA/items/853225f856f4dc7b7fa9)も投稿していますのそちらも参考に。
# 動画

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">投稿用<br>Slerpサンプル1 <a href="https://t.co/mHnTSWlUk7">pic.twitter.com/mHnTSWlUk7</a></p>&mdash; TANUKEINA (@FH1b4mzzirXPoiM) <a href="https://twitter.com/FH1b4mzzirXPoiM/status/1305158060487319554?ref_src=twsrc%5Etfw">September 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>









<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">投稿用<br>Slerpサンプル2 <a href="https://t.co/tmpvOFXeS6">pic.twitter.com/tmpvOFXeS6</a></p>&mdash; TANUKEINA (@FH1b4mzzirXPoiM) <a href="https://twitter.com/FH1b4mzzirXPoiM/status/1305158198714744832?ref_src=twsrc%5Etfw">September 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>








オブジェクトの色も線形補間(Color.Lerp)によって変化させています。

#Slerp(Vector3 a, Vector3 b, float t);
####引数
* Vector3 a :開始点
* Vector3 b :終了点
* float t :二点の補間値

計算式は

```math
\text{Slerp}(a,b;t) = \frac{\sin[(1-t)Ω]}{\sin Ω}a + \frac{\sin[tΩ]}{\sin Ω}b
```

a,bの二点間を球面的に補間するということを表してるわけですが、
これだけ見るとなんだかよくわかりませんね。
この辺は私がわざわざ説明するより、先人達の記事の方が何倍もわかりやすいので以下にリンクを貼っておきます。

[○×つくろ〜ドットコム　その57 クォータニオンを"使わない"球面線形補間](http://marupeke296.com/DXG_No57_SheareLinearInterWithoutQu.html)

#SlerpExample

```cs:SlerpExample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SlerpExample : MonoBehaviour
{
    public Transform sunrise;
    public Transform sunset;

    //始点から終点までの時間
    public float journeyTime = 1.0f;

    [System.NonSerialized]
    public float fracComplete;

    private float startTime;

    private void Start()
    {
        startTime = Time.time;
    }

    private void Update()
    {
        //弧の中心
        Vector3 center = (sunrise.position + sunset.position) * 0.5f;

        //弧を中心にするため調整
        center -= new Vector3(0, -1, 0);

        //中心を基準として円弧を補間する
        Vector3 riseRelCenter = sunrise.position - center;
        Vector3 setRelCenter = sunset.position - center;

        fracComplete = (Time.time - startTime) / journeyTime;

        transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete);
        transform.position += center;
    }
}
```

#ColorLerp
[Lerpの記事](https://qiita.com/TANUKEINA/items/853225f856f4dc7b7fa9)から少し改良しています。

```cs:ColorLerp.cs
sing System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ColorLerp : MonoBehaviour
{
    public enum LerpType
    {
        Lerp,
        Slerp
    }

    public LerpType lerpType;

    private LerpExample lerpExample;
    private SlerpExample slerpExample;
    private Material mat;

    private void Start()
    {
        mat = this.GetComponent<Renderer>().material;
        lerpExample = GetComponent<LerpExample>();
        slerpExample = GetComponent<SlerpExample>();
    }

    void Update()
    {
        switch (lerpType)
        {
            case LerpType.Lerp:
                mat.color = Color.Lerp(Color.blue, Color.red, lerpExample.fractionOfJourney);
                break;
            case LerpType.Slerp:
                mat.color = Color.Lerp(Color.blue, Color.red, slerpExample.fracComplete);
                break;
        }
    }
}
```

#まとめ

* Slerpは球面線形補間をするメソッド
* 回転表現に使用できる
* Quaternionだと理解しにくいので動画を見て、直感的に理解してくれたら幸いです