【发布时间】:2017-11-18 14:51:00
【问题描述】:
【问题讨论】:
标签: math unity3d game-maker trigonometry
【问题讨论】:
标签: math unity3d game-maker trigonometry
尽管看起来有点像正弦波,但实际上是cubic Bézier curve。那篇 Wikipedia 文章介绍了数学,here 是一篇介绍应该相当简单的实现的文章。假设您通常像在 UE4 蓝图中一样水平绘制线条,我会将控制点放置在水平中点,并且与每个控制点处于相同的 y 水平,从而创建一个“阶梯”形状:
p0 . . . p1 . . . .
. . . . . . . . .
. . . . p2 . . . p3
首先,您需要创建一个可以计算给定曲线上的点的函数。这是文章中的 C# 实现:
Vector3 CalculateBezierPoint(float t,
Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
float u = 1 – t;
float tt = t*t;
float uu = u*u;
float uuu = uu * u;
float ttt = tt * t;
Vector3 p = uuu * p0; //first term
p += 3 * uu * t * p1; //second term
p += 3 * u * tt * p2; //third term
p += ttt * p3; //fourth term
return p;
}
您可以将 Vector3 更改为 2D Vector2 结构,或将其分解为 x/y 值并调整数学以进行补偿(抱歉,我使用 GML 已经有十年了,所以我不确定您必须使用哪些类型的数据结构)。
现在您有了计算曲线上点的方法,您可以编写一个函数来绘制它。在不丢失任何像素的情况下绘制它的最简单方法是绘制一系列线段。同样,这里是文章中的 C# 实现:
q0 = CalculateBezierPoint(0, p0, p1, p2, p3);
for(int i = 1; i <= SEGMENT_COUNT; i++)
{
t = i / (float) SEGMENT_COUNT;
q1 = CalculateBezierPoint(t, p0, p1, p2, p3);
DrawLine(q0, q1);
q0 = q1;
}
有更好的方法,但这应该可以帮助您入门并为您提供一些词汇以供进一步搜索。干杯!
【讨论】: