一个贝塞尔曲线编辑工具(2d)

news/2024/11/15 9:17:18/文章来源:https://www.cnblogs.com/sailJs/p/18328984

曲线在unity下如何绘制?

类似绘制圆,是用一段一段的线段拼接来模拟的,这边也是类似,可以用一段一段的线段来模拟曲线。

 

既然要模拟,那我们也得知道贝塞尔曲线的公式才行。

一般用的比较多的就是3次贝塞尔曲线,该曲线由起点p1,p1的控制点c1,终点p2,p2的控制点c2组成。

公式为:p = p1*(1-t)+ 3*c1*t*(1-t)+ 3*c2*t2*(1-t) + p2*t3,t的范围[0, 1]

 

下面是unity下的一个贝塞尔编辑工具

 

public class MyBezierPath2dEdit : MonoBehaviour
{public string m_ControlInObjectName = "In"; //作为曲线结束时, c2控制点public string m_ControlOutObjectName = "Out"; //作为曲线启示点时, c1控制点public Color m_ControlInColor = Color.red; //c2控制点连线颜色public Color m_ControlOutColor = Color.blue; //c1点连线颜色public Color m_PathColor = Color.yellow; //路径绘制颜色
[Range(1, 60)]public int m_Steps = 30; //曲线用多少个直线来模拟public bool m_LoopPath = false; //曲线是否首尾连接private void OnDrawGizmos(){var mainPoints = new List<Vector2>();var In = new List<Vector2>();var Out = new List<Vector2>();bool isAddRectTransform = null != GetComponent<RectTransform>();foreach (Transform child in transform){mainPoints.Add(child.transform.position);foreach (Transform child2 in child.transform){if (child2.name == m_ControlInObjectName)In.Add(child2.transform.position);if (child2.name == m_ControlOutObjectName)Out.Add(child2.transform.position);}//如果没有定义的点,则补充上去if (In.Count < mainPoints.Count){GameObject go = new GameObject(m_ControlInObjectName);if (isAddRectTransform)go.AddComponent<RectTransform>();go.transform.SetParent(child.transform, false);In.Add(go.transform.position);}if (Out.Count < mainPoints.Count){GameObject go = new GameObject(m_ControlOutObjectName);if (isAddRectTransform)go.AddComponent<RectTransform>();go.transform.SetParent(child.transform, false);Out.Add(go.transform.position);}}//曲线控制线for (int i = 0; i < mainPoints.Count; i++){Gizmos.color = m_ControlInColor;Gizmos.DrawLine(mainPoints[i], In[i]);Gizmos.color = m_ControlOutColor;Gizmos.DrawLine(mainPoints[i], Out[i]);}Gizmos.color = m_PathColor;if (In.Count >= mainPoints.Count && Out.Count >= mainPoints.Count){int mainPtCnt = mainPoints.Count;if (!m_LoopPath) mainPtCnt--;for (int i = 0; i < mainPtCnt; i++){int i2 = (i + 1) % mainPoints.Count;Vector3 P2 = new Vector3(0, 0, 0);float step = 1.0f / m_Steps;if (step > 0.01f){for (float t = 0; t < 1 + step; t += step){Vector3 P1 = P2;P2 = CalcBezierPathPoint(mainPoints[i], Out[i], In[i2], mainPoints[i2], t);if (t > 0){Gizmos.DrawLine(P1, P2);}}}}}}private Vector3 CalcBezierPathPoint(Vector3 P0, Vector3 C0, Vector3 C1, Vector3 P1, float t){float temp = 1 - t;Vector2 result = temp * temp * temp * P0 + 3 * temp * temp * t * C0 + 3 * temp * t * t * C1 + t * t * t * P1;return result;}}

 

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

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

相关文章

烧录算法制作

前言 在使用Keil的时候,我们一般会通过一个下载器与目标芯片连接,这样就可以实现的代码下载或调试。那么下载器是如何将我们的应用程序烧写在我们芯片内部Flash当中的呢,是否可以同样的方式烧录在外部Flash上呢?这是此片文章所要说明的。 MDK下载算法原理 通过MDK创建一批与…

Mocreak Office Installer(Office安装部署工具) v2.3.0.703 中文绿色版

概述 Mocreak 是一款一键自动化下载、安装、部署正版 Office 的办公增强工具。该工具完全免费、无广告、绿色、无毒、简约、高效、安全。软件特点 一键快速下载、安装、部署最新版 Microsoft Office 软件。提供简约、高效,且可自定义的图形界面,提升部署效率。支持将 Office …

LLM大模型:deepspeed实战和原理解析

多年前搞大数据,因为单节点无力存储和计算PB级别的数据,所以hadoop这种分布式存储和计算框架是标配!如今搞大模型,仍然需要对大量样本数据做计算,因为涉及矩阵运算,单机单卡运算效率太低,也涉及到分布式计算了,大模型时代的分布式pre-train和Inference框架就有现成的—…

Iterator与Iterable(迭代器与可迭代)

一 前言 环境: python 3.10 win10 二 Iterator(迭代器) Iterator 是python的内置类型之一,看下其定义该类型的实例对象称之为iterator(迭代器对象) 要得到一个iterator(迭代器对象),可用内置函数iter()将 list tuple等转成迭代器对象 也可以自定义一个迭代器类型的class,…

java基础 手写回忆篇

java 特性:分布行,跨平台性,安全行,多线程,面向对象编程,简单性 高级语言分为编译型和解释型: 编译型:整个程序写完一起编译速度快效率高 解释性:需要一句解释一句编译速度慢效率低 java是两者综合:编译器(javac)先把你写好的代码编译成class文件(字节码文件)再用j…

洛谷 Markdown - 从入门到精通

洛谷 Markdown - 从入门到精通 编写——Jerrycyx(CSDN,洛谷) 洛谷博客查看因为洛谷博客的渲染机制和其它地方不一样,可能导致渲染错误,所以你可以到这里食用:https://www.luogu.com.cn/paste/wu019n2x绪论希望更丰富的展现?使用 Markdown。这是洛谷文字编辑时会出现的一行…

Dev-C++ 的功能与外观优化

预备 安装 安装 Dev-C++ 5.11:官方下载:https://sourceforge.net/projects/orwelldevcpp/(若下载缓慢可选择 Problem Downloading->Auto-select) 蓝奏云下载:https://wwu.lanzouq.com/iTwwW07r28ni运行安装包即可。 更改语言 如果界面语言为英文,选择 Tools -> Env…

OI 中各种输入方式的速度比较(C++,大量实测数据,附图表)

测试信息 本次共测试了以下几种输入方式的速度:scanf cin 快读 位运算快读 fread() + 位运算快读 关闭同步流的 cin 开启 tie 绑定并关闭同步流的 cin每组测试各输入方式均使用相同数据,为随机生成的 \(1000000\)(1E6) 个整数,范围在 \([-(2^{31}-1),2^{31}-1]\)(即 int …

乒乓球比赛计分系统需求流程——最小可用产品

计应222_杜晓瑾_2210502012 乒乓球比赛计分系统需求流程——最小可用产品 作为一名裁判,我希望可以在系统上进行网络计时、记成绩,以便大家可以监督和观看任务 Sprint 1 2 3 4 5 6 7 8 9 10 开通网络计时(1h) 1 0 网络计时(4h) 4 2 1 0 进行网络记成绩(3h…

Easysearch、Elasticsearch、Amazon OpenSearch 快照兼容对比

在当今的数据驱动时代,搜索引擎的快照功能在数据保护和灾难恢复中至关重要。本文将对 Easysearch、Elasticsearch 和 Amazon OpenSearch 的快照兼容性进行比较,分析它们在快照创建、恢复、存储格式和跨平台兼容性等方面的特点,帮助大家更好地理解这些搜索引擎的差异,从而选…

管理项目更高效:顶级进度管理系统大比拼

国内外主流的10款项目进度管理网站对比:PingCode、Worktile、滴答清单(TickTick)、Todoist、NarTick、Teambition、Monday.com、Asana、ClickUp、Trello。在选择合适的项目进度管理工具时,许多项目经理面临着如何找到既能满足团队需求又易于操作的系统的难题。市场上众多的…