[英]c# Calculate a 3D point from starting 3D point using distance and angles
[英]Calculate a 3D trajectory by start point, end point and height
我已经想出了如何使用起点和角度制作 3D 轨迹。 但是,我试图从起点、终点和高度制作轨迹。
我尝试在 3D 空间中的 2D 平面上采用抛物线的方法。 我计算了 Prabola 的 A、B 和 C 值以及它在抛物线上给定 3 个点所在的平面。 但是,我在进行这种计算时遇到了一些复杂情况,我认为这与无法在没有平面的情况下正确计算 Z 轴有关,但我无法判断。
除了平面上的 2D 抛物线之外,谷歌没有提供另一个可能的答案,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);
查看第二张图片,抛物线似乎是正确的,除了缩放不正确。 让我们来看看你的代码。
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 坐标。 这意味着xs
和zs
值应该只能在 -1 和 1 之间,从而将自己限制在单位圆的范围内。
值xs
和zs
看起来需要按系数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 抛物线的东西。
使固定!!
在 Linear 的 GetX(float x) 方法中。 它应该是:
public Vector3 GetX(float x) => => r0 + (x - r0.x)/v.x * v;
我在计算中犯了一个小错误,我立即注意到并进行了更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.