首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >三维向量曲线平滑算法

三维向量曲线平滑算法

作者头像
keyle
发布2024-11-01 12:17:10
发布2024-11-01 12:17:10
2370
举报
文章被收录于专栏:礼拜八不工作礼拜八不工作

在网上看到一个平滑算法,很好用,经过测试它的效率很高,Chaikin 函数调用2-3次会获得一个相对较好的曲线。算法链接 原理是不断的裁切三角形让其分裂成2个三角,2个三角变成4个,以此类推,最终会越来越平滑从而接近一个圆。

代码语言:javascript
复制
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(LineRenderer))]
public class SmoothAlgorithm : MonoBehaviour
{

    private float minRadius = 1.5f;
    private float maxRadius = 3.5f;
    private int num = 25;
    private LineRenderer lr;
    private Vector3[] points;

    void Start()
    {
        lr = GetComponent<LineRenderer>();
        GenerateRandomPath();
        SetLR(points);
    }

    void GenerateRandomPath()
    {
        points = new Vector3[num];

        float angle = 360.0f / num;

        for (int i = 0; i < num; i++)
        {
            points[i] = Quaternion.AngleAxis((angle * i), Vector3.forward) * Vector3.up * Random.Range(minRadius, maxRadius);
        }
    }

    void SetLR(Vector3[] pts)
    {
        lr.SetVertexCount(pts.Length);
        for (int i = 0; i < pts.Length; i++)
        {
            lr.SetPosition(i, pts[i]);
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            points = Chaikin(points);
            SetLR(points);
        }

        if (Input.GetKeyDown(KeyCode.G))
        {
            GenerateRandomPath();
            SetLR(points);
        }
    }

    Vector3[] Chaikin(Vector3[] pts)
    {
        Vector3[] newPts = new Vector3[(pts.Length - 2) * 2 + 2];
        newPts[0] = pts[0];
        newPts[newPts.Length - 1] = pts[pts.Length - 1];

        int j = 1;
        for (int i = 0; i < pts.Length - 2; i++)
        {
            newPts[j] = pts[i] + (pts[i + 1] - pts[i]) * 0.75f;
            newPts[j + 1] = pts[i + 1] + (pts[i + 2] - pts[i + 1]) * 0.25f;
            j += 2;
        }
        return newPts;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 礼拜八不工作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档