计算3D空间中圆的点

时间:2016-05-28 13:33:25

标签: vector 3d line geometry point

我现在已经摸不着头脑了。如何做到这一点。

我在3d空间中有两个已定义的向量。将矢量X称为(0,0,0),将矢量Y称为(3,3,3)。我将在这两个向量之间的一条线上得到一个随机点。在这一点上,我想形成一个圆(一些点)垂直于给定半径的X和Y之间的线。

希望它清楚我正在寻找什么。我已经查看过许多类似的问题,但根据这些问题无法弄清楚。谢谢你的帮助。

修改: (无法将所有内容都置于评论中,因此请在此处添加) @WillyWonka

嗨,感谢您的回复,我在实施您的解决方案方面取得了一些成功,但是遇到了一些麻烦。它大部分时间都有效,除了Y点位于(20,20,20)之类的特定场景。如果它直接坐在任何轴上就可以了。

但是一旦它进入对角线,垂直点和原点之间的距离由于某种原因变得更小,并且在非常特定的对角线位置它有点翻转垂直点。

IMAGE

以下是您要查看的代码

    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);

    }

1 个答案:

答案 0 :(得分:1)

首先要做的是找到垂直于XY线的平面的两个正交基矢量,通过您选择的点。

首先需要找到一个垂直于XY的矢量。要做到这一点:

  • 首先将矢量 XY 标准化
  • XY 与X轴
  • 如果这个非常小(为了数值稳定性,比方说&lt; 0.1)那么它必须与X轴平行/反平行。我们选择Y轴。
  • 如果没有,那么我们选择X轴
  • 对于任何选择的轴, XY 交叉以获得其中一个基础向量;再次与 XY 交叉以获取第二个向量。
  • 规范化它们(不是严格必要但非常有用)

现在您有两个基础向量来计算圆坐标,称之为 A B 。拨打您选择的点 P

然后可以通过

参数计算圆上的任何点

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

其中t是一个角度(介于0和2π之间),r是圆的半径。