【问题标题】:Projectile trajectory / flight path弹道/飞行路径
【发布时间】:2017-09-12 08:02:26
【问题描述】:

我正在尝试制作一个运动行为在图中显示为红色的射弹。 我现在知道和拥有的是两个向量;开始和结束。 最终目标是在迭代时使弧线具有一些随机性,并以 lerp 方式改变射弹速度。我以前做过几代线性运动,但没有这样的。

如果我的问题感觉像是要求您为我做我的工作(我通常害怕作为新手编码员提出问题),我能否就我应该研究哪些方法/命令提供一些提示和提示?语言为 C#,Unity 版本为 5.6

编辑#1

在获得一些头部方向之后,我可以实现更接近最终目标功能的东西。

蓝色直线只是表示 A(起始点)和 B(目标)之间的距离和角度。红色弧线是我愿意让我的弹丸移动的轨迹。

幸运的是,我认为我想要引导弹丸遵循的路径是三次贝塞尔曲线,并在上图中显示的编辑器中得到了 A、B、modA 和 modB 的结果。我还需要做一些事情来实际安装弹丸以遵循这条路径并控制它的速度等。以下是我今天无法解决的更多问题。

首先,一般条件是 A 是固定的,B 不是。为了保持通常所需的飞行路径,我想我需要另一条虚拟线 lineB(从 modA 到 modB)来同步 lineA 的角度和距离,因此当 B(目标)在各个方向上移动时,弧不会太偏斜,但在我今天的尝试中,要么我从 lineA 得到了错误的角度,要么是 modA 刚刚围绕 A 运行,并且数字很奇怪,就像 B 从 A 的直线运动中的角度变化一样。

第二个是在第一次射弹发射后和下一次发射后有一些随机但相似的红色弧线。我猜当我通过第一个时这会更容易一些,因为这只是控制 lineB 的问题。

编辑#2

上面提到的所有函数都已解决:从 A 到 B 生成一条路径,弧由 modA 和 modB 以及 modA 和 modB 在每次迭代中的随机性以及 modA 和 modB 根据 B 在中的位置进行调整实时。

现在剩下的就是让弹丸真正跟随路径并控制它的速度直到到达 B。下面是生成弧路径的代码。我应该如何处理?

public Transform[] controlPoints = new Transform[4];
public LineRenderer lineRenderer;

private int curveCount = 0;
private int SEGMENT_COUNT = 50;

private void DrawCurve()
{
    for (int j = 0; j < curveCount; j++)
    {
        for (int i = 1; i <= SEGMENT_COUNT; i++)
        {
            float t = i / (float)SEGMENT_COUNT;
            int nodeIndex = j * 3;
            Vector3 pixel = CalculateCubicBezierPoint(
                t,
                controlPoints[nodeIndex].position,
                controlPoints[nodeIndex + 1].position,
                controlPoints[nodeIndex + 2].position,
                controlPoints[nodeIndex + 3].position);

            lineRenderer.positionCount = (((j * SEGMENT_COUNT) + i));
            lineRenderer.SetPosition((j * SEGMENT_COUNT) + (i - 1), pixel);
        }
    }
}

private Vector3 CalculateCubicBezierPoint(float t, Vector3 start, Vector3 modA, Vector3 modB, Vector3 end)
{
    float u = 1 - t;
    float t2 = Mathf.Pow(t, 2);
    float u2 = Mathf.Pow(u, 2);
    float t3 = Mathf.Pow(t, 3);
    float u3 = Mathf.Pow(u, 3);

    Vector3 p = u3 * start;
    p += 3 * u2 * t * modA;
    p += 3 * u * t2 * modB;
    p += t3 * end;

    return p;
}

【问题讨论】:

  • 看起来您不希望它基于物理。只是随机的?无论如何,添加您尝试过的内容会很好。提示:生成随机路径并将它们放入列表中然后迭代它们
  • 没错。我把它当作一个向量数学类型的问题。红色弧线是我希望以类似方式进行的运动行为的示例类型。
  • @Programmer 所以,我应该先单独生成一个路径,然后让对象跟着它走吧?我现在就开始调查!谢谢。
  • 是的,这就是我在第一条评论中告诉你的。您必须根据我在第一条评论中尝试过的内容以及是否存在问题来修改您的问题。
  • @Programmer 你能看看我的编辑吗?我已经完成了一些事情,还有更多问题。

标签: unity3d


【解决方案1】:

你应该使用 AnimationCurve。

您可以在检查器中编辑“图形曲线”(公共变量 AnimationCurve),然后使用此脚本沿路径移动对象。

using UnityEngine;
using System.Collections;

public class AnimationPath : MonoBehaviour 
{
    public AnimationCurve XCurve;

    public float TotalTravelTime = 5.0f;

    public float TravelSpeed = 50.0f;

    public float XRange = 10.0f;

    // Use this for initialization
    void Start () 
    {
        StartCoroutine("Travel");
    }

    IEnumerator Travel()
    {
        float ElapsedTime = 0.0f;

        while(ElapsedTime < TotalTravelTime)
        {
            float XPos = XCurve.Evaluate(ElapsedTime/TotalTravelTime) * XRange;

            transform.position = new Vector3(XPos, transform.position.y, transform.position.z + TravelSpeed * -Time.deltaTime);

            yield return null;

            ElapsedTime += Time.deltaTime;
        }
    }
}

希望对你有帮助。

【讨论】:

  • 非常感谢您的好意!一旦我完成了程序员提示的当前试用,我将尝试这个。我想我需要的是一个三次贝塞尔路径,并且刚刚完成了使用 LineRenderer 绘制该路径。当我第一次看到你的提示时,我吓坏了,因为我以前采用了更复杂的方法:使用点 modA 和 modB 获取点 A(start) 和 B(End) 以在迭代时动态调整曲率A在实例化时固定,B通过实时位置变化进行被动调整,modA和modB根据A和B的角度和距离进行相应的调整。
  • 使用我的解决方案,您可以手动编辑图表内的曲线。这简单。脚本运行良好。
  • 通过阅读我怀疑不是。不过,我对变化很好奇。此功能的最终目标是拥有;假设以这种路径方式连续发射 3 个弹丸,它们的路径形状略有不同,以使事情看起来更有趣。
  • 我已经尝试了你的脚本,调整了一些内容并添加了一些东西,但我无法得到一个喜欢的结果。不过,非常感谢您的提示。这让我了解了有关 AnimationCurve 用法的更多信息!我也编辑了我的问题,如果您不介意,您可以看一下并提供更多提示吗?
猜你喜欢
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2022-07-26
  • 2020-01-19
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多