unity 控制点 贝塞尔曲线_Unity中画贝塞尔曲线

最近想做一个类似曲线指示器的东西,搜了一下资料发现这个,记录一下。

简介

贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。

一条贝塞尔曲线有着n个控制点,曲线上的每个点由公式推算出来。n个控制点对应着n-1次的贝塞尔曲线。

一阶曲线

math?formula=B_%7B1%7D(t)%20%3D%20P_%7B0%7D%20%2B%20(P_%7B1%7D%20%3D%20P_%7B0%7D)t

math?formula=B_%7B1%7D(t)%20%3D%20%7B%5Ccolor%7BRed%7D%7B%20(1%20-%20t)%7D%7DP_%7B0%7D%20%2B%20%7B%5Ccolor%7BRed%7Dt%7DP_%7B1%7D%2C%20t%5Cin%20%5B0%2C%201%5D

二阶曲线

math?formula=B_%7B1%7D%20%3D%20%7B%5Ccolor%7BRed%7D%20%7B(1%20-%20t)%5E%7B2%7D%7D%7DP_%7B0%7D%20%2B%20%7B%5Ccolor%7BRed%7D%7B2t(1-t)%7D%7DP_%7B1%7D%2B%7B%5Ccolor%7BRed%7D%7Bt%5E%7B2%7D%7D%7DP_%7B1%7D%2C%20t%5Cin%20%5B0%2C%201%5D

..三阶以上我就不写了,写公式好麻烦

实现

话不多说,直接开始实现

///

/// 计算二次贝塞尔曲线值

///

/// t值

/// 起始点

/// 控制点

/// 目标点

///

private static Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)

{

float u = 1 - t;

float tt = t * t;

float uu = u * u;

// B(t) = (1 - t)^2*p0 + 2t(1 - t)p1 + t^2*p2

Vector3 p = uu * p0;

p += 2 * u * t * p1;

p += tt * p2;

return p;

}

有了能计算2阶贝塞尔曲线的函数了,下一步就是变换t值,求出每一个点。

///

/// 给定中间点个数,给出每个点的坐标

///

/// 起始点

/// 控制点

/// 目标点

/// 中间点个数

///

public Vector3[] GetBeizrList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int segmentNum)

{

Vector3[] path = new Vector3[segmentNum];

for(int i = 1; i <= segmentNum; i++)

{

float t = i / (float)segmentNum;

Vector3 pixel = CalculateCubicBezierPoint(t, startPoint, controlPoint, endPoint);

// 设置linerenderer达到画线的目的

lineRenderer.positionCount = i;

lineRenderer.SetPosition(i - 1, pixel);

path[i - 1] = pixel;

Debug.Log(path[i - 1]);

}

return path;

}

这样,给点三个点就能够完整画出一条直线,排版有些乱,先这样吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值