簡體   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