繁体   English   中英

通过起点、终点和高度计算 3D 轨迹

[英]Calculate a 3D trajectory by start point, end point and height

我已经想出了如何使用起点和角度制作 3D 轨迹。 但是,我试图从起点、终点和高度制作轨迹。

我尝试在 3D 空间中的 2D 平面上采用抛物线的方法。 我计算了 Prabola 的 A、B 和 C 值以及它在抛物线上给定 3 个点所在的平面。 但是,我在进行这种计算时遇到了一些复杂情况,我认为这与无法在没有平面的情况下正确计算 Z 轴有关,但我无法判断。

除了平面上的 2D 抛物线之外,谷歌没有提供另一个可能的答案,3D 轨迹使用起点、角度和功率乘数产生一个公式。

  • 有没有办法计算给定起点、终点和高度的 3D 轨迹?

感谢您的帮助

编辑

我使用 3 个点计算抛物线的代码(以防有人想知道我是如何做到的,也许可以纠正我做错了什么)

public Parabola(Vector3 pa, Vector3 pb, Vector3 pc)
        {
            this.pa = pa;
            this.pc = pc;
            float a1 = -pa.x * pa.x + pb.x * pb.x, b1 = -pa.x + pb.x, c1 = -pa.y + pb.y;
            float a2 = -pb.x * pb.x + pc.x * pc.x, b2 = -pb.x + pc.x, c2 = -pb.y + pc.y;
            float bm = -(b2 / b1), a3 = bm * a1 + a2, c3 = bm * c1 + c2;
            float a = c3 / a3, b = (c1 - a1 * a) / b1, c = pa.y - a * pa.x * pa.x - b * pa.x;
            this.a = a; this.b = b; this.c = c;
            plane = Vector3.Cross(pb - pa, pc - pa);
        }

public Vector3 GetPoint(float x) 
        {
            float angle = Mathf.Atan2(pc.z - pa.z, pc.x - pa.x) * Mathf.Rad2Deg;
            float xs = Mathf.Cos(angle * Mathf.Deg2Rad) * x, zs = Mathf.Sin(angle * Mathf.Deg2Rad) * x;
            return new Vector3(xs, a * x * x + b * x + c, zs); 
        }

public Vector3 ProjectOn(float x) => Vector3.ProjectOnPlane(GetPoint(x), plane);

当它仅在 2 轴而不是 3 轴上时,结果看起来不错。这里有 2 张图像用于演示: 正确的但仅在 2 轴上(起点和终点的 Z 值相等) 不正确,现在在 3 轴上(Z 值不相等)

查看第二张图片,抛物线似乎是正确的,除了缩放不正确。 让我们来看看你的代码。

public Vector3 GetPoint(float x) 
    {
        float angle = Mathf.Atan2(pc.z - pa.z, pc.x - pa.x) * Mathf.Rad2Deg;
        float xs = Mathf.Cos(angle * Mathf.Deg2Rad) * x, zs = Mathf.Sin(angle * Mathf.Deg2Rad) * x;
        return new Vector3(xs, a * x * x + b * x + c, zs); 
    }

我在这里做了很多假设,但似乎x是一个从 0.0 到 1.0 的值,分别代表抛物线的起点和终点。 如果是这样,您将完全根据角度和x的正弦/余弦来确定该点的 X 和 Z 坐标。 这意味着xszs值应该只能在 -1 和 1 之间,从而将自己限制在单位圆的范围内。

xszs看起来需要按系数s进行缩放,该系数s通过测量投影到 XZ 平面时起点和终点的二维距离计算得出的。 这应该将抛物线拉伸到足以到达终点。

我找到了答案,但这是一种解决方法。

在搞乱 3D 抛物线之前,我搞乱了 3D 中的线性方程。 与抛物线不同,即使在 3D 中,直线也具有定义的方程( Pn = P0 + tx V )(Pn 向量包含 XYZ,P0 初始点包含 XYZ,t float,V Vector3)

此外,这里只有一条线,通过2点进入,即使在3D。

我用它来制作由 2 个点和一个高度组成的轨迹。 我在这两个点的中心创建一个新点,并将高度值添加到这些点的最高 Y 值上,从而创建一个 Apex。

然后我使用与之前相同的计算来计算具有这 3 个点的抛物线将具有的 A、B 和 C 值。

我做了一个方法,它接受一个 X 值并返回一个 Vector3,其中包含这个 X 在线性方程上的点,而是根据抛物线方程改变向量的 Y 值。

实际上创建了一条高架线,我制作了一些看起来和行为都非常像 3D 抛物线的东西。

如果您使用 C#,这里是代码(图片): 线性

弹道

使固定!!

在 Linear 的 GetX(float x) 方法中。 它应该是:

public Vector3 GetX(float x) => => r0 + (x - r0.x)/v.x * v;

我在计算中犯了一个小错误,我立即注意到并进行了更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM