2016-05-28 17 views
0

私はしばらく頭を傷つけています。3D空間内の円上の点を計算する

私は3次元空間に2つの定義されたベクトルを持っています。ベクトルXを(0,0,0)に、ベクトルYを(3,3,3)にします。私はそれらの2つのベクトル間の線上にランダムな点を得ます。そして、この点について、私は与えられた半径でXとYの間の線に垂直な円(いくらかの点)を形成したいと思います。

私は何を求めているのか明確にしています。私は多くの同様の質問を見てきましたが、それらに基づいてそれを理解することはできません。助けてくれてありがとう。

編集: は @WillyWonka(couldntのコメントので、ここでそれを追加することにすべてをかける)

こんにちは、お返事に感謝、私はあなたのソリューションを実装するといくつかの適度な成功を持っていたが、それにいくつかの問題を持っています。それは、Yポイントが(20,20,20)のような位置にある特定のシナリオを除いて、ほとんどの場合に機能します。もしそれがどんな軸にも直接座っていれば、その罰金。

しかし、斜めになるとすぐに、垂直点と原点の距離が何らかの理由で小さくなり、非常に特定の対角位置では、ちょうど垂直点が反転します。ここで

IMAGE

は、あなたが何をあなたが最初にやりたいことはラインXYに垂直平面の直交する2つの基底ベクトルを見つけることです

public Vector3 X = new Vector3(0,0,0); 
    public Vector3 Y = new Vector3(0,0,20); 

    Vector3 A; 
    Vector3 B; 

    List<Vector3> points = new List<Vector3>(); 


    void FindPerpendicular(Vector3 x, Vector3 y) 
    { 

     Vector3 direction = (x-y); 
     Vector3 normalized = (x-y).normalized; 
     float dotProduct1 = Vector3.Dot(normalized, Vector3.left); 
     float dotProduct2 = Vector3.Dot(normalized, Vector3.forward); 
     float dotProduct3 = Vector3.Dot(normalized, Vector3.up); 



     Vector3 dotVector = ((1.0f - Mathf.Abs(dotProduct1)) * Vector3.right) + 
          ((1.0f - Mathf.Abs(dotProduct2)) * Vector3.forward) + 
          ((1.0f - Mathf.Abs(dotProduct3)) * Vector3.up); 

     A = Vector3.Cross(normalized, dotVector.normalized);  
     B = Vector3.Cross(A, normalized); 

    } 

答えて

0

見するためのコードです選択したポイントを通過します。

まず、XYに垂直なベクトルを見つける必要があります。これはそれその後、(数値的安定性のためのが< 0.1を言わせて)非常に小さい場合にはX軸

    • ベクトルを正規XY最初
    • ドットXY:これを行うにはX軸に対して平行/反平行でなければなりません。 Y軸を選択します。
    • 我々はそれが基底ベクトルの1を取得するためにXYクロス、どちらか選択した軸のX軸
    • を選択した後でない場合は、再びこのXYを再度取得して第2のベクターを得る。
    • (必要に応じて非常に有用ではない厳密)それらを正規化

    あなたは今Bそれらを呼び出す、あなたのサークルの座標を計算するために、2つの基底ベクトルを持っています。選択したポイントをPと呼んでください。

    そして円上の任意の点はパラメトリックt(0と2πの間)の角度であり、rは円の半径である

    Q(r, t) = P + r * (A * cos(t) + B * sin(t))

    によって計算することができます。

  • +0

    こんにちは、あなたの返信をありがとう、私はあなたのソリューションを実装することで中程度の成功を収めましたが、いくつかの問題があります。それは、Yポイントが(20,20,20)のような位置にある特定のシナリオを除いて、ほとんどの場合に機能します。もしそれがどんな軸にも直接座っていれば、その罰金。 – CosmicSeizure

    +0

    @CosmicSeizure Xについてはどうですか?それはいつも(0、0、0)ですか?あなたがドットチェックをするときにXYを正規化するのを忘れないでください(この場合、その(1/sqrt(3)、1/sqrt(3)、1/sqrt(3))) –

    +0

    こんにちは、画像を見てください。ありがとう。 XとYは任意の位置にあり得る。 – CosmicSeizure

    関連する問題