【问题标题】:Calculate point on a circle in 3D space计算 3D 空间中圆上的点
【发布时间】:2016-05-29 19:41:05
【问题描述】:

我现在一直在摸索如何做到这一点。

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

    }

【问题讨论】:

    标签: vector 3d line geometry point


    【解决方案1】:

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

    你首先需要找到一个垂直于 XY 的向量。为此:

    • 首先将向量归一化XY
    • XY 与 X 轴
    • 如果它非常小(为了数值稳定性,比如说
    • 如果不是,那么我们选择 X 轴
    • 对于任何选择的轴,将其与 XY 交叉 以获得一个基向量;再次将 thisXY 交叉以获得第二个向量。
    • 规范化它们(不是严格必要但非常有用)

    您现在有两个基向量来计算您的圆坐标,分别称为 AB。调用您选择的点P

    那么圆上的任意一点都可以通过参数化计算

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

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

    【讨论】:

    • 您好,感谢您的回复,我在实施您的解决方案方面取得了一定的成功,但遇到了一些麻烦。它在大多数情况下都有效,除了 Y 点位于 (20,20,20) 等位置的特定场景。如果它直接位于任何轴上,则很好。
    • @CosmicSeizure X 呢?总是在 (0, 0, 0) 吗?不要忘记在进行点检查时对 XY 进行归一化(所以在这种情况下是 (1/sqrt(3), 1/sqrt(3), 1/sqrt(3)))
    • 嗨,我用代码和图像更新了问题,请看一下。谢谢。 X 和 Y 可以在任何位置。
    • @CosmicSeizure 您是否正确规范化基向量?顺便说一句,您无法真正判断它们是否被翻转,因为您首先提供了参考基向量,因此您不能始终确定基的方向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多