0xf

日記だよ

二次ベジェ曲線

以下サイトを参考にして書いてみた。

scrapbox.io

いつ間にかC#にタプル構文が入っていてこういう処理が書きやすくなっていていい感じ。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LineScript : MonoBehaviour
{
    public Transform trans1;
    public Transform trans2;
    void Update()
    {
        LineRenderer render = GetComponent<LineRenderer>();

        var control1 = (trans1.position + trans2.position) / 3 + Vector3.up * 2;
        var control2 = (trans1.position + trans2.position) * 2 / 3 + Vector3.down * 2;

        var totalPoints = 10;
        render.positionCount = totalPoints;

        foreach (var tp in BezierCurve(totalPoints, trans1.position, trans2.position, control1, control2))
        {
            render.SetPosition(tp.Item1, tp.Item2);
        }
    }

    // max >= 3
    // t = 0.0f to 1.0f
    IEnumerable<(int, Vector3)> BezierCurve(int max, Vector3 start, Vector3 end, Vector3 control1, Vector3 control2)
    {
        yield return (0, start);
        for (int i = 1; i <= max - 2; i++)
        {
            // float である必要がある
            var t = (float)i / (float)(max-1);
            yield return (i, (1.0f - t) * (1.0f - t) * (1.0f - t) * start +
            3.0f * (1.0f - t) * (1.0f - t) * t * control1 +
            3.0f * (1.0f - t) * t * t * control2 +
            t * t * t * end);
        }
        yield return (max - 1, end);
    }
}