在x-y轴上的传播曲线



为了在我的游戏中发射抛射物,我在3D空间中设置了一个曲线函数,其中曲线沿着z轴传播,遵循以下公式:

x = this.LinePoints[t - 1].x + xOffset;
y = this.LinePoints[t - 1].y + yOffset;
z = t == 1 ? 0.35f : math.cos(scaleFactor * (t * 0.1f)) * (t * 0.5f);

t从1到40,LinePoints是(x, y)上从起点到终点的直线。

我需要沿着x轴和y轴的组合将曲线从起点传播到终点(保持相同的函数,但要旋转)。如果曲线在(x, y)上

我该怎么做呢?

我们把这个问题分成三个部分:

1。使弹丸跟随LinePoints

很简单。只要把this.LinePoints[t - 1] - this.LinePoints[t - 2]加到transform.position就可以了。

void FixedUpdate() {
float xDiff = LinePoints[t - 1].x - LinePoints[t - 2].x;
float yDiff = LinePoints[t - 1].y - LinePoints[t - 2].y;
transform.position += new Vector2(xDiff, yDiff);
t++;
}

2。添加不旋转的z轴曲线

我们需要为z轴曲线定义一个函数,并简单地将其应用于Y轴上。

void FixedUpdate() {
float zDiff = ZFunction(t) - ZFunction(t - 1);
float xDiff = LinePoints[t - 1].x - LinePoints[t - 2].x;
float yDiff = LinePoints[t - 1].y - LinePoints[t - 2].y + zDiff;
transform.position += new Vector2(xDiff, yDiff);
t++;
}
float ZFunction(int t) {
if (t == 1) {
return 0.35f;
}
else {
return Mathf.Cos(scaleFactor * (t * 0.1f)) * (t * 0.5f);
}
}

当起始点和结束点的Y值相同时,这将正常工作。

3。旋转z轴曲线

我们需要先得到点之间的夹角,然后得到以一定角度旋转的X和Y元素。角的X元素为cos(angle), Y元素为sin(angle)。将z函数的值乘以对面的三角函数轴,然后将其添加到位置的顶部。

你可以用Vector2.Angle()得到角度,只是要记住把它转换成弧度,这样它就可以被Mathf三角函数吸收了。

void FixedUpdate() {
float angle = Vector2.Angle(startPoint, endPoint) * Mathf.Deg2Rad;
float zDiff = ZFunction(t) - ZFunction(t - 1);
float xDiff = LinePoints[t - 1].x - LinePoints[t - 2].x + zDiff * Mathf.Sin(angle);
float yDiff = LinePoints[t - 1].y - LinePoints[t - 2].y + zDiff * Mathf.Cos(angle);
transform.position += new Vector2(xDiff, yDiff);
t++;
}
float ZFunction(int t) {
if (t == 1) {
return 0.35f;
}
else {
return Mathf.Cos(scaleFactor * (t * 0.1f)) * (t * 0.5f);
}
}

注意:如果您不需要LinePoints中的特定点,您可能应该放弃数组并动态获取适当的位置。我建议你看看Vector2.Lerp(),或者最好自己做一下计算。

代码非常粗糙,没有经过测试,所以如果你遇到任何问题,请注释。

相关内容

  • 没有找到相关文章

最新更新