服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity贝塞尔曲线之美体验

Unity贝塞尔曲线之美体验

2022-12-06 11:43韭本菜 C#

这篇文章主要带大家体验Unity贝塞尔曲线之美,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近项目中用到了贝塞尔曲线,学习完成后记录一下自己的学习结果吧。

Unity贝塞尔曲线之美体验

 

一阶贝塞尔曲线

Unity贝塞尔曲线之美体验

一阶贝塞尔曲线就是一条线,我们很容易根据 t 求出 t 点的位置。

P(t)=P0+(P1-P0)*t =(1-t)*P0+tP1 ; t[ 0,1] ,且其等同于线性插值。

 

二阶贝塞尔曲线

Unity贝塞尔曲线之美体验

取平面内三个不共线的点,AB:AC=CD:CE,这个时候BD又是一条直线,可以按照一阶的贝塞尔方程来进行线性插值了。

P(B)=(1-t)*P0+tP1 ;

P(D)=(1-t)P1+tP2 ;

P(t)=(1-t)*P(B)+tP(D)

=(1-t)*((1-t)*P0+tP1)+t((1-t)P1+tP2 )

=(1-t) *P0+2t*(1-t)*P1+t*P2 ;t[0,1];

代码:

public LineRenderer line_b;
public LineRenderer line_a;
public LineRenderer line_c;

public Transform start;
public Transform end;
public Transform c;

  void Start()
  {
   
  }
  void Update()
  {

      line_a.SetPosition(0, start.position);
      line_a.SetPosition(1, c.position);
      line_c.SetPosition(0, end.position);
      line_c.SetPosition(1, c.position);

     // float distance = Vector3.Distance(start.position, end.position);
      Vector3 controlPoint = c.position;
          //start.position + (start.position+ c.position).normalized * distance / 1.6f;

      Vector3[] bcList = GetBeizerPathPointList(start.position, controlPoint, end.position, 50);
      line_b.positionCount = bcList.Length + 1;
      line_b.SetPosition(0, start.position);
      for (int i = 0; i < bcList.Length; i++)
      {
          Vector3 v = bcList[i];
          line_b.SetPosition(i + 1, v);
      }


  }
  public static Vector3[] GetBeizerPathPointList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int pointNum)
  {
      Vector3[] BeizerPathPointList = new Vector3[pointNum];
      for (int i = 1; i <= pointNum; i++)
      {
          float t = i / (float)pointNum;
          Vector3 point = GetBeizerPathPoint(t, startPoint,
              controlPoint, endPoint);
          BeizerPathPointList[i - 1] = point;
      }
      return BeizerPathPointList;
  }

  //贝塞尔曲线二次方公式
  private static Vector3 GetBeizerPathPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
  {
      return (1 - t) * (1 - t) * p0 + 2 * t * (1 - t) * p1 + t * t * p2;
  }

 

三阶贝塞尔曲线

Unity贝塞尔曲线之美体验

三阶贝塞尔曲线和二阶其实是同一个道理,都可以按照一阶的贝塞尔方程来进行线性插值。这里就直接上公式了。

P(t)=P0*(1-t) +3P1*t*(1-t)+3P2*t*(1-t)+P3*t ; t[0,1];

代码

public Transform start;
public Transform end;
public Transform c0;
public Transform c1;

  public LineRenderer line_b;
  public LineRenderer line_a;
  public LineRenderer line_c;
  public LineRenderer line_d;
  void Start()
  {
      
  }

  // Update is called once per frame
  void Update()
  {
      line_a.SetPosition(0, start.position);
      line_a.SetPosition(1, c0.position);

      line_c.SetPosition(0, c1.position);
      line_c.SetPosition(1, c0.position);

      line_d.SetPosition(0, c1.position);
      line_d.SetPosition(1, end.position);



      Vector3[] bcList = GetBeizerPathPointList(start.position, c0.position,c1.position, end.position, 50);
      line_b.positionCount = bcList.Length + 1;
      line_b.SetPosition(0, start.position);
      for (int i = 0; i < bcList.Length; i++)
      {
          Vector3 v = bcList[i];
          line_b.SetPosition(i + 1, v);
      }

  }

  public static Vector3[] GetBeizerPathPointList(Vector3 startPoint, Vector3 controlPoint0, Vector3 controlPoint1, Vector3 endPoint, int pointNum)
  {
      Vector3[] BeizerPathPointList = new Vector3[pointNum];
      for (int i = 1; i <= pointNum; i++)
      {
          float t = i / (float)pointNum;
          Vector3 point = GetBeizerPathPoint(t, startPoint,
              controlPoint0, controlPoint1, endPoint);
          BeizerPathPointList[i - 1] = point;
      }
      return BeizerPathPointList;
  }



  //贝塞尔曲线三次方公式
  private static Vector3 GetBeizerPathPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2,Vector3 p3)
  {
      return (1 - t) * (1 - t) * (1 - t) * p0 +
              3 * p1 * t * (1 - t) * (1 - t) +
              3 * p2 * t * t * (1 - t) +
              p3 * t * t * t;
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/f402455894/article/details/120745388

延伸 · 阅读

精彩推荐
  • C#C# Linq延迟查询的执行实例代码

    C# Linq延迟查询的执行实例代码

    这篇文章主要介绍了C# Linq延迟查询执行的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    沉默♪☞小傲11502022-11-14
  • C#C# 日历类功能的实例代码

    C# 日历类功能的实例代码

    本文通过实例代码给大家介绍了C# 日历类的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧...

    孤者自清6222022-01-11
  • C#C# XmlDocument操作XML案例详解

    C# XmlDocument操作XML案例详解

    这篇文章主要介绍了C# XmlDocument操作XML案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    z海清5262022-11-30
  • C#c# 如何实现图片压缩

    c# 如何实现图片压缩

    这篇文章主要介绍了c# 实现图片压缩的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    龙骑科技5582022-10-18
  • C#浅谈C# 字段和属性

    浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...

    艾码士J11032022-09-20
  • C#C# SqlHelper应用开发学习

    C# SqlHelper应用开发学习

    这篇文章主要和大家一起学习C# SqlHelper应用开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    蒙小米9992021-12-18
  • C#C# 设计模式系列教程-桥接模式

    C# 设计模式系列教程-桥接模式

    桥接模式降低了沿着两个或多个维度扩展时的复杂度,防止类的过度膨胀,解除了两个或多个维度之间的耦合,使它们沿着各自方向变化而不互相影响。...

    Wang Juqiang5892021-11-23
  • C#C# Redis学习系列(一)Redis下载安装使用

    C# Redis学习系列(一)Redis下载安装使用

    这篇文章主要为大家分享了C# Redis学习系列教程第一篇, Redis下载、安装、使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    change_4_now7042022-01-04