unity笔记_贝塞尔曲线_曲线 quard quart-程序员宅基地

技术标签: c#  unity  游戏引擎  unity笔记  

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

public class BezierCurve
{

    public enum BezierType
    {
        /// <summary>
        /// 一阶
        /// </summary>
        line,
        /// <summary>
        /// 二阶
        /// </summary>
        Quardatic,
        /// <summary>
        /// 三阶
        /// </summary>
        Cubic
    }
    public Transform[] BezierHandle;
    public BezierType type;

    public BezierCurve(Transform[] BezierHandle, BezierType type)
    {
        this.BezierHandle = BezierHandle;
        this.type = type;
    }

    public Vector3 GetCurrentBezier(float t)
    {
        switch (type)
        {
            case BezierType.line:
                return lineBezier(t);
            case BezierType.Quardatic:
                return QuardaticBezier(t);
            case BezierType.Cubic:
                return CubicBezier(t);
            default:
                return Vector3.zero;
        }
    }
    public void SetCurrentBezier(Transform[] handles)
    {
        if (handles.Length > BezierHandle.Length)
        {
            for (int i = 0; i < BezierHandle.Length; i++)
            {
                BezierHandle[i] = handles[i];
            }
        }
        else
        {
            for (int i = 0; i < handles.Length; i++)
            {
                BezierHandle[i] = handles[i];
            }
        }
    }
    public void SetCurrentBezier(Transform[] handles, BezierType bezierType)
    {
        type = bezierType;
        SetCurrentBezier(handles);
    }
    /// <summary>
    /// 一阶贝塞尔曲线
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    Vector3 lineBezier(float t)
    {
        if (BezierHandle.Length < 2) throw new System.Exception("使用一阶贝塞尔曲线必须有两个控制点");
        Vector3 a = BezierHandle[0].position;
        Vector3 b = BezierHandle[1].position;
        return a + (b - a) * t;
    }

    /// <summary>
    /// 二阶贝塞尔曲线
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    Vector3 QuardaticBezier(float t)
    {
        if (BezierHandle.Length < 3) throw new System.Exception("使用二阶贝塞尔曲线必须有三个控制点");
        Vector3 a = BezierHandle[0].position;
        Vector3 b = BezierHandle[1].position;
        Vector3 c = BezierHandle[2].position;

        Vector3 aa = a + (b - a) * t;
        Vector3 bb = b + (c - b) * t;
        return aa + (bb - aa) * t;
    }
    /// <summary>
    /// 三阶贝塞尔
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    Vector3 CubicBezier(float t)
    {
        if (BezierHandle.Length < 4) throw new System.Exception("使用三阶贝塞尔曲线必须有四个个控制点");
        Vector3 a = BezierHandle[0].position;
        Vector3 b = BezierHandle[1].position;
        Vector3 c = BezierHandle[2].position;
        Vector3 d = BezierHandle[3].position;

        Vector3 aa = a + (b - a) * t;
        Vector3 bb = b + (c - b) * t;
        Vector3 cc = c + (d - c) * t;

        Vector3 aaa = aa + (bb - aa) * t;
        Vector3 bbb = bb + (cc - bb) * t;
        return aaa + (bbb - aaa) * t;
    }




    public static Vector3 GetlineBezier(Vector3 a, Vector3 b, float t)
    {
        return a + (b - a) * t;
    }
    public static Vector3 GetQuardaticBezier(Vector3 a, Vector3 b, Vector3 c, float t)
    {

        Vector3 aa = a + (b - a) * t;
        Vector3 bb = b + (c - b) * t;
        return aa + (bb - aa) * t;
    }
    public static Vector3 GetCubicBezier(Vector3 a, Vector3 b, Vector3 c, Vector3 d, float t)
    {
        Vector3 aa = a + (b - a) * t;
        Vector3 bb = b + (c - b) * t;
        Vector3 cc = c + (d - c) * t;

        Vector3 aaa = aa + (bb - aa) * t;
        Vector3 bbb = bb + (cc - bb) * t;
        return aaa + (bbb - aaa) * t;
    }

}

参考博文:

【游戏开发进阶】玩转贝塞尔曲线,教你在Unity中画Bezier贝塞尔曲线(二阶、三阶),手把手教你推导公式_linxinfa的专栏-程序员宅基地_bezier.method.ac攻略

【游戏开发实战】Unity实现类似GitHub地球射线的效果(LineRenderer | 贝塞尔曲线)_linxinfa的专栏-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_60232873/article/details/122981226

智能推荐

Teacher模型线上授课,蒸馏训练速度提升2.3倍_模型蒸馏可以提高计算效率吗-程序员宅基地

文章浏览阅读1.4k次。自今年年初,由于疫情的原因,为了减少人员聚集,降低病毒扩散的可能性,各大中小学校都陆续开始了网上教学。上网课已经成了家喻户晓的一种学习方式了。可是你知道吗,在深度学习领域,模型训练也是可..._模型蒸馏可以提高计算效率吗

【计算机视觉(一)】图像数据表示_图片可以通过数据表示吗-程序员宅基地

文章浏览阅读1.7k次。数字图像是连续的光信号经过传感器的采样在空间域上的表达。一张图像是由一个包含若干个像素点的矩形框组成的,试着把一张图在“画图”软件中放大会有更直观的感受,下面是lena图放大后的效果。可以看到图像是由很多个小格子组成的,每个小格子都只有一种颜色,这是构成图像的最小单元——像素(pixel)。不同的像素值代表了不同的颜色,像素值的值域一般在0到255(包括)之间,也就是256个整数,因此可以..._图片可以通过数据表示吗

StringBuffer 和 StringBuilder (Java)_stringbu er-程序员宅基地

文章浏览阅读128次。StringBufferStringBuilder_stringbu er

安装mongodb问题记录_cyrus-sasl is needed by mongodb-database-tools-100-程序员宅基地

文章浏览阅读322次。1,下载https://www.mongodb.com/try/download/community下载MongoDB Compass和MongoDB Community Server包安装2,报错1,此界面单击"Ignore"按钮,继续进行下面操作,2,进入C:\Program Files\MongoDB\Server\4.0\bin安装目录下,3,cmd执行mongod -dbpath D:\MongoDB\data\db 创建数据库文件的存放位置命令:4,然后在C盘安装bin目录下另_cyrus-sasl is needed by mongodb-database-tools-100.5.2-1.x86_64 cyrus-sasl-g

2021大唐杯5G大赛学习笔记-1_大唐杯物理层过程-程序员宅基地

文章浏览阅读1.5k次。PRACH(Physical Random Access Channel,物理随机接入信道),是UE一开始发起呼叫时的接入信道,UE接收到FPACH响应消息后,会根据Node B指示的信息在PRACH信道发送RRC Connection Request消息,进行RRC连接的建立。PUCCHPUCCH,Physical Uplink Control ..._大唐杯物理层过程

java map.get_Java Map get()用法及代码示例-程序员宅基地

文章浏览阅读6.2k次。Java中的Map接口的get()方法用于检索或获取由参数中提到的特定键映射的值。当映射不包含键的此类映射时,它将返回NULL。用法:thisMap.get(Object key_element)参数:该方法采用对象类型的一个参数key_element,表示应该获取其关联值的键。返回值:该方法返回与此Map集合中的key_element关联的值。以下程序说明了java.util.Map.get()..._map.get

随便推点

C# 中的接口:Interface_c# interface 声明构造方法-程序员宅基地

文章浏览阅读426次。前言接口的申明  接口的定义与组成: 指描述可属于任何类或结构的一组功能,就是一种规范、功能。可由属性、方法、事件、索引器或这四种成员类型的任意组合构成。  命名规则: 接口名称习惯性以 I 开头,跟在 I 后的第一个字符也是大写的。  注意事项: 接口不能包含字段;接口成员不允许添加访问修饰符,默认就是 public ;成员也不能加 static 访问修饰符;接口不能包含实现其成员的任何代码,而只能定义成员本身(如不允许写具有方法体的函数);实现过程必须在实现接口的类中完成。接口的实现与继承_c# interface 声明构造方法

使用node创建服务器成功但是页面打不开_node本地服务器打不开网页-程序员宅基地

文章浏览阅读3.5k次。命令行没有报错,服务器创建成功但是 localhost:3030 打不开页面注意!!!如果显示这样,那么就是创建服务器成功了,但是你没有接受返回值可以在app.on('request', async (req, res) => { res.end('123'); // 添加返回的结果 });或者是你在 localhost:3030/xx (xx路由里面接收的值)这样使用 localhost:3030/xx 也可以打开不要傻傻的一直在试localhost:3030然后想,_node本地服务器打不开网页

(01)JavaScript-初识JavaScript_是一门解释型编程语言,是一种基于原型编程、多范式的动态脚本语言,并且支持面向对-程序员宅基地

文章浏览阅读164次。(01)ECMAScript 6-初始JavaScript1. 什么是JavaScriptJavaScript ( JS ) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。JavaScript 是一种基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。运行环境浏览器nodejs2. JavaScript的组成部分2.1 ECMAScript(js标准)描述了该语言的语法和基本对象,兼容性100%。注释 单行// 、多行/**/_是一门解释型编程语言,是一种基于原型编程、多范式的动态脚本语言,并且支持面向对

10个最热门的大数据技术_大数据最前沿的技术有哪些-程序员宅基地

文章浏览阅读8.7k次,点赞7次,收藏37次。大数据已经融入到各行各业,哪些大数据技术是最受欢迎?哪些大数据技术潜力巨大?请听大讲台老师对10个最热门的大数据技术的介绍。_大数据最前沿的技术有哪些

读书APP的不二备胎,我选了网易蜗牛读书_一些在微信读书找不到的书籍去哪看-程序员宅基地

文章浏览阅读236次。刚赶走一个种田文又迎来一个争霸流蹦出一个霸道总裁我挥挥手还让不让好好读书啦网易蜗牛读书致力于为热爱阅读的用户提供沉浸、简洁的电子阅读体验,并希望与用户一起构建起立体化、全方位的移动阅读社区,满足不同阅读层次用户的个性化阅读需求。网易蜗牛读书APP官网网易蜗牛读书,只做优质出版书的在线阅读APP,主打每天“一小时免费阅读”,简直是电子书APP中的一亩桃花源。在快节奏的这个时代,网易蜗牛读书APP反潮流的只为那些注重阅读品质的人群服务,给人久违的慢悠悠阅读时光。只是1小时够不够用呢?我觉得80%的用户足够用了,_一些在微信读书找不到的书籍去哪看

Python2 判断两个中文字符是否相等_python中表格中的两个中文怎么判断是否相等-程序员宅基地

文章浏览阅读7.4k次,点赞2次,收藏16次。Python2 字符编码解码 encode/decode,编码类型转换;获取编码格式_python中表格中的两个中文怎么判断是否相等