Unity中的数学基础——贝塞尔曲线

一:前言 

一条贝塞尔曲线是由一组定义的控制点P0到 Pn,n=1为线性,n=2为二次......第一个和最后一个控制点称为起点和终点,中间的控制点一般不会位于曲线上 
获取两个点之间的点就是通过线性插值( Mathf.Lerp),0 <= t <= 1


二:贝塞尔曲线公式

——线性公式:给定点P0、P1,线性贝兹曲线只是一条两点之间的直线。这条线由下式给出

1


——二阶贝塞尔曲线:二次方贝塞尔曲线的路径由给定点P0、P1、P2的函数B(t)公式推导:由(P0,P1),(P1,P2)分别求线性公式所得的结果P0‘ 和 P1‘再带入线性公式,整理所得即为二次公式
P0,P1所求:
1.1.1
P1,P2所求:
1.2.2
P0,P1,P2二次方公式:
1.2.3
简化所得
1.2.4


——三阶贝塞尔曲线:P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1或P2;这两个点只是在那里提供方向。P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。
其公式为
1.3.1 


三:公式转换为代码

using UnityEngine;/// <summary>
/// 贝塞尔工具类
/// </summary>
public static class BezierUtils
{/// <summary>/// 线性贝塞尔曲线/// </summary>public static Vector3 BezierCurve(Vector3 p0, Vector3 p1, float t){Vector3 B = Vector3.zero;B = (1 - t) * p0 + t * p1;return B;}/// <summary>/// 二阶贝塞尔曲线/// </summary>public static Vector3 BezierCurve(Vector3 p0, Vector3 p1, Vector3 p2, float t){Vector3 B = Vector3.zero;float t1 = (1 - t) * (1 - t);float t2 = 2 * t * (1 - t);float t3 = t * t;B = t1 * p0 + t2 * p1 + t3 * p2;return B;}/// <summary>/// 三阶贝塞尔曲线/// </summary>public static Vector3 BezierCurve(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t){Vector3 B = Vector3.zero;float t1 = (1 - t) * (1 - t) * (1 - t);float t2 = 3 * t * (1 - t) * (1 - t);float t3 = 3 * t * t * (1 - t);float t4 = t * t * t;B = t1 * p0 + t2 * p1 + t3 * p2 + t4 * p3;return B;}
}

 四:绘制出曲线

  

using System.Collections.Generic;
using UnityEngine;public class BezierTest : MonoBehaviour
{public int m_CurveDensity;//曲线密度public bool m_IsSecondOrderBezier;//是否为二阶贝塞尔曲线,否则为三阶贝塞尔曲线private List<Transform> m_ControlPointList = new List<Transform>();//所有的控制点(控制点作为挂载此脚本的游戏物体的子物体)public void OnDrawGizmos(){//添加控制点m_ControlPointList.Clear();foreach (Transform trans in transform){m_ControlPointList.Add(trans);}List<Vector3> pointList = new List<Vector3>();//曲线上的所有点if (m_IsSecondOrderBezier){if (m_ControlPointList.Count < 3){return;}//获取曲线上的所有点for (int i = 0; i < m_ControlPointList.Count - 2; i += 2){Vector3 p0 = m_ControlPointList[i].position;Vector3 p1 = m_ControlPointList[i + 1].position;Vector3 p2 = m_ControlPointList[i + 2].position;for (int j = 0; j <= m_CurveDensity; j++){float t = j * 1f / m_CurveDensity;Vector3 point = BezierUtils.BezierCurve(p0, p1, p2, t);pointList.Add(point);}}}else{if (m_ControlPointList.Count < 4){return;}//获取曲线上的所有点for (int i = 0; i < m_ControlPointList.Count - 3; i += 3){Vector3 p0 = m_ControlPointList[i].position;Vector3 p1 = m_ControlPointList[i + 1].position;Vector3 p2 = m_ControlPointList[i + 2].position;Vector3 p3 = m_ControlPointList[i + 3].position;for (int j = 0; j <= m_CurveDensity; j++){float t = j * 1f / m_CurveDensity;Vector3 point = BezierUtils.BezierCurve(p0, p1, p2, p3, t);pointList.Add(point);}}}//绘制所有点foreach (var point in pointList){Gizmos.DrawSphere(point, 0.1f);}//绘制控制点连线Gizmos.color = Color.red;for (int i = 0; i < m_ControlPointList.Count - 1; i++){Gizmos.DrawLine(m_ControlPointList[i].position, m_ControlPointList[i + 1].position);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AR室内导航技术之技术说明与效果展示

随着科技的飞速发展&#xff0c;我们周围的环境正在经历着一场数字化的革命。其中&#xff0c;AR室内导航技术以其独特的魅力&#xff0c;为我们打开了一扇通往全新数字化世界的大门。本文将为您详细介绍这一技术的实现原理、工具应用以及成品展示&#xff0c;带您领略AR室内导…

k8s 安装 kubernetes安装教程 虚拟机安装k8s centos7安装k8s kuberadmin安装k8s k8s工具安装 k8s安装前配置参数

k8s采用master, node1, node2 。三台虚拟机安装的一主两从&#xff0c;机器已提前安装好docker。下面是机器配置&#xff0c;k8s安装过程&#xff0c;以及出现的问题与解决方法 虚拟机全部采用静态ip, master 30机器, node1 31机器, node2 32机器 机器ip 192.168.164.30 # ma…

谷歌浏览器的受欢迎之谜:探析其引人入胜的特点

文章目录 &#x1f340;引言&#x1f340;1. 极速的浏览体验&#x1f340;2. 简洁直观的界面&#x1f340;3. 强大的同步功能&#x1f340;4. 丰富的扩展生态系统&#x1f340;5. 安全与隐私的关注&#x1f340;6. 持续的技术创新&#x1f340;7. 跨平台支持和云整合&#x1f3…

vue中css修改滚动条样式

vue中css修改滚动条样式 效果图&#xff1a; 代码(在app.vue中全局增加下面样式即可)&#xff1a; &::-webkit-scrollbar {width: 8px;height: 8px;border-radius: 3px;}/*定义滚动条轨道 内阴影圆角*/&::-webkit-scrollbar-track {//-webkit-box-shadow: inset 0 0 …

合宙Air724UG LuatOS-Air LVGL API控件--进度条 (Bar)

进度条 (Bar) Bar 是进度条&#xff0c;可以用来显示数值&#xff0c;加载进度。 示例代码 – 创建进度条 bar lvgl.bar_create(lvgl.scr_act(), nil) – 设置尺寸 lvgl.obj_set_size(bar, 200, 20); – 设置位置居中 lvgl.obj_align(bar, NULL, lvgl.ALIGN_CENTER, 0, 0) …

bh004- Blazor hybrid / Maui 使用 BootstrapBlazor UI 库快速教程

1. 建立工程 bh004_BootstrapBlazorUI 源码 2. 添加 nuget 包 <PackageReference Include"BootstrapBlazor" Version"7.*" /> <PackageReference Include"BootstrapBlazor.FontAwesome" Version"7.*" />3. 添加样式表文…

精准营销的三种打法:社群圈层、人群包、跨屏联动

数据时代的来临&#xff0c;使营销变得有迹可寻&#xff0c;不再只是广撒网&#xff0c;只求愿者上钩&#xff0c;而是更注重精准营销。 若想制定优质的数字营销方案&#xff0c;就要懂得如何与数据打交道&#xff0c;知道抓取哪些数据。众引传播在数据抓取时较为关注两类数据…

Unity3D Pico VR 手势识别 二

Unity3D Pico VR 手势识别_Cool-浩的博客-CSDN博客 此篇主要讲解怎么手势追踪&#xff0c;手势姿态自定义预制识别&#xff0c;不会导入SDK和配置环境的请看上一章节 环境要求 SDK 版本&#xff1a;2.3.0 及以上PICO 设备型号&#xff1a;PICO Neo3 和 PICO 4 系列PICO 设备系…

【大模型AIGC系列课程 2-2】大语言模型的“第二大脑”

1. 大型语言模型的不足之处 很多人使用OpenAI提供的GPT系列模型时都反馈效果不佳。其中一个主要问题是它无法回答一些简单的问题。 ● 可控性:当我们用中文问AI一些关于事实的问题时,它很容易编造虚假答案。 ● 实时性:而当你询问它最近发生的新闻事件时,它会干脆地告诉你…

unity中Game视图绘制XYZ坐标轴

Game视图显示XYZ坐标轴 功能一&#xff1a;仅显示XYZ坐标轴前期准备设置箭头模型的材质1、在“Assets”中&#xff0c;新建一个名为“Materials”文件夹&#xff0c;专门用于放置材质。选中“Materials”文件夹&#xff0c;鼠标右键->“创建”->“材质”2、重命名为“Red…

【业务功能篇85】微服务-springcloud-Nginx-反向代理-网关

Nginx域名 1.hosts文件 在c:/window/system32/drivers/etc/hosts文件&#xff0c;我们在这个文件中添加 192.168.56.100 msb.mall.com注意如果是没有操作权限&#xff0c;那么点击该文件右击属性&#xff0c;去掉只读属性即可 通过这个域名访问到Nginx服务 2.Nginx的方向代…

FFI绕过disable_functions

文章目录 FFI绕过disable_functions[RCTF 2019]NextphpPHP7.4 FFI参考 FFI绕过disable_functions [RCTF 2019]Nextphp 首先来看这道题目 index.php <?php if (isset($_GET[a])) {eval($_GET[a]); } else {show_source(__FILE__); }查看一下phpinfo 发现过滤了很多函数&…

Linux环境下SVN服务器的搭建与公网访问:使用cpolar端口映射的实现方法

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

智慧工厂解决方案:推动制造业转型升级的新引擎

随着信息技术的迅猛发展和制造业竞争的加剧&#xff0c;智慧工厂成为了推动制造业转型升级的重要引擎。智慧工厂解决方案通过整合物联网、人工智能、大数据分析等先进技术&#xff0c;实现生产过程的智能化、自动化和高效化&#xff0c;为企业提供了更加灵活、智能的生产模式和…

list【1】介绍与使用(超详解哦)

list的介绍与使用 引言list介绍接口使用默认成员函数迭代器容量元素访问数据修改 list的算法接口总结 引言 继vector之后&#xff0c;我们继续来介绍STL容器&#xff1a;list 对于容器的使用其实有着类似的模式&#xff0c;参考之前vector的使用可以让我们更快的上手&#xff…

【MySQL】2、MySQL数据库的管理

常用 describe user; Field:字段名称 Type:数据类型 Null :是否允许为空 Key :主键 Type:数据类型 Null :是否允许为空key :主键 Default :默认值 Extra :扩展属性&#xff0c;例如:标志符列&#xff08;标识了种子&#xff0c;增量/步长&#xff09;1 2 id&#xff1a;1 3 5 …

self instruct 介绍

《SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions》 github: self-instruct 背景 大模型表现惊人&#xff0c;但是严重依赖于人工编写的指令数据。然而&#xff0c;依靠人工标注数据成本高昂。本文中提出self-instruct框架&#xff1a;一种基于大…

Android创建签名文件,并获取签名文件MD5,SHA1,SHA256值

一、创建Android签名文件 使用Android Studio开发工具&#xff0c;可视化窗口进行创建 第一步&#xff1a;点击AndroidStudio导航栏上的 Build→Generate Signed Bundle / APK 第二步&#xff1a;选择APK选项 第三步&#xff1a;创建签名文件 第四步&#xff1a;输入创建签名的…

如何五分钟设计制作自己的蛋糕店小程序

在现如今的互联网时代&#xff0c;小程序已成为企业推广和销售的重要利器。对于蛋糕店来说&#xff0c;搭建一个小程序可以为其带来更多的品牌曝光和销售渠道。下面&#xff0c;我们将以乔拓云平台为例&#xff0c;来教你如何从零开始搭建自己的蛋糕店小程序。 首先&#xff0c…

2023/8/27周报

目录 摘要 论文阅读 1、标题和现存问题 2、过度平滑和度量方法 3、处理过坡 4、实验结果 深度学习 1、解决可视化问题 2、CART算法 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇Pairnorm:解决GNNS中的过平滑问题的论文。PairNorm 的核心思想是在图卷积层之间引…