![](/img/trans.png)
[英]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.