通过起点、终点和高度计算 3D 轨迹
Calculate a 3D trajectory by start point, end point and height
我已经知道如何使用起点和角度制作 3D 轨迹。
但是,我正在尝试从起点、终点和高度制作轨迹。
我尝试在 3D space 中采用 2D 平面上的抛物线方法。我计算了抛物线的 A、B 和 C 值以及它在抛物线上给定的 3 个点所在的平面。
但是,我对这种计算有些复杂,我认为这与无法在没有平面的情况下正确计算 Z 轴有关,但我不知道。
除了平面上的 2D 抛物线 google 没有提供其他可能的答案,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 张图片用于演示:
看第二张图片,抛物线似乎是正确的,只是比例不正确。让我们看看您的代码。
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 的值,分别代表抛物线的起点和终点。如果是这样,您将完全根据角度的 sine/cosine 和 x
来确定该点的 X 和 Z 坐标。这意味着值 xs
和 zs
应该只能在 -1 和 1 之间,将自己限制在单位圆的范围内。
值 xs
和 zs
看起来需要按系数 s
进行缩放,该系数是通过测量投影到 XZ 上的起点和终点的二维距离计算得出的飞机。这应该将抛物线拉伸到刚好到达终点。
我找到了答案,但这是一种解决方法。
在弄乱 3D 抛物线之前,我弄乱了 3D 中的线性方程。
与抛物线不同,直线即使在 3D 中也有定义的方程([=37=]Pn = P0 + t x V)(Pn 向量包含 XYZ,P0 初始点包含 XYZ,t float,V Vector3)
此外,即使在 3D 中,也只有 一条 线穿过 2 个点。
我用它来制作一条由 2 个点和一个高度组成的轨迹。
我在这两个点的中心创建一个新点,并将高度值添加到点的最高 Y 值,从而创建一个顶点。
然后我使用与之前相同的计算来计算 A、B 和 C 值
有这 3 个点的抛物线本来就有。
我制作了一个方法,它接受一个 X 值和 returns 一个包含该 X 在线性方程上的点的 Vector3,而是根据抛物线方程更改向量的 Y 值。
实际上创建了一条高架线,我制作了一些看起来和行为都非常像 3D 抛物线的东西。
如果你使用的是 C#,这里是代码(图片):
修复!!
在 Linear 的 GetX(float x) 方法中。
应该是:
public Vector3 GetX(float x) => => r0 + (x - r0.x)/v.x * v;
我在计算中犯了一个小错误,我立即注意到并进行了更改。
我已经知道如何使用起点和角度制作 3D 轨迹。 但是,我正在尝试从起点、终点和高度制作轨迹。
我尝试在 3D space 中采用 2D 平面上的抛物线方法。我计算了抛物线的 A、B 和 C 值以及它在抛物线上给定的 3 个点所在的平面。 但是,我对这种计算有些复杂,我认为这与无法在没有平面的情况下正确计算 Z 轴有关,但我不知道。
除了平面上的 2D 抛物线 google 没有提供其他可能的答案,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 张图片用于演示:
看第二张图片,抛物线似乎是正确的,只是比例不正确。让我们看看您的代码。
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 的值,分别代表抛物线的起点和终点。如果是这样,您将完全根据角度的 sine/cosine 和 x
来确定该点的 X 和 Z 坐标。这意味着值 xs
和 zs
应该只能在 -1 和 1 之间,将自己限制在单位圆的范围内。
值 xs
和 zs
看起来需要按系数 s
进行缩放,该系数是通过测量投影到 XZ 上的起点和终点的二维距离计算得出的飞机。这应该将抛物线拉伸到刚好到达终点。
我找到了答案,但这是一种解决方法。
在弄乱 3D 抛物线之前,我弄乱了 3D 中的线性方程。 与抛物线不同,直线即使在 3D 中也有定义的方程([=37=]Pn = P0 + t x V)(Pn 向量包含 XYZ,P0 初始点包含 XYZ,t float,V Vector3)
此外,即使在 3D 中,也只有 一条 线穿过 2 个点。
我用它来制作一条由 2 个点和一个高度组成的轨迹。 我在这两个点的中心创建一个新点,并将高度值添加到点的最高 Y 值,从而创建一个顶点。
然后我使用与之前相同的计算来计算 A、B 和 C 值 有这 3 个点的抛物线本来就有。
我制作了一个方法,它接受一个 X 值和 returns 一个包含该 X 在线性方程上的点的 Vector3,而是根据抛物线方程更改向量的 Y 值。
实际上创建了一条高架线,我制作了一些看起来和行为都非常像 3D 抛物线的东西。
如果你使用的是 C#,这里是代码(图片):
修复!!
在 Linear 的 GetX(float x) 方法中。 应该是:
public Vector3 GetX(float x) => => r0 + (x - r0.x)/v.x * v;
我在计算中犯了一个小错误,我立即注意到并进行了更改。