根据三个平面的法线和点的距离得到一个点

时间:2016-03-07 15:46:43

标签: c# unity3d geometry

我有三个平面的法线,它们彼此成90度并穿过原点。

我也有一个点到三个平面的距离。如何确定C#中点的位置?

到目前为止我所拥有的......

    public static Vector3 RealWorldSpaceToOtherSpace(Vector3 realspace, Vector4 clipplane)
    {
        // Work out the normal vectors of 3 imaginary planes
        Vector3 floor = new Vector3(clipplane.X, clipplane.Y, clipplane.Z);
        Vector3 centre = new Vector3(1f, -clipplane.X / clipplane.Y, 0f);
        Vector3 wall = Vector3.Cross(floor, centre);

        // Get distances from the planes
        float distanceToFloor = realspace.y;
        float distanceToCentre = realspace.x;
        float distanceToWall = realspace.z;

        //   ?
        //   ?  do stuff here
        //   ?

        // return ????
    }

2 个答案:

答案 0 :(得分:1)

由于平面彼此成90度并穿过原点,因此它们的法线与相同的原点形成正交坐标系。因此,到新坐标系中,到每个平面的距离是沿着与对应于平面(标准化)法线的轴的点的坐标。

因此找到每个平面的归一化法线,乘以与平面的相应距离,然后加起来找到该点。

需要注意的是,您需要知道该点所在的每个平面的;如果它位于法线的另一侧,请在相应的距离前面加一个减号。

答案 1 :(得分:1)

给定从点到一个平面的距离。该点现在可以位于距离第一个平面的定义距离的平面内的任何一个点,因此您已将位置从3维内的任何位置缩小到任何位置,第3维的这些子集只有2维..

当您获得从该点到第二个平面的距离时。你现在拥有相同的信息,这个点可以是一个平面。您会注意到这两个平原相交并形成一条线。没有必要存储此行。只要知道你已经将可能的点的位置缩小到1维。

最后给出从点到第三个平面的距离。您可以在距原始平面的定义距离处创建新平面,此平面应与其他2个新平面相交。所有三个平面将在一个点相交,这将是该点的位置。

幸运的是,我们可以添加到平面矢量的距离,以便创建新的平面。然后我们可以通过使用每个平面的相关尺寸来获得点的位置,以获得点的位置。

public static Vector3 RealWorldSpaceToOtherSpace(Vector3 realspace, Vector4 clipplane)
{
    // Work out the normal vectors of 3 imaginary planes
    Vector3 floor = new Vector3(clipplane.X, clipplane.Y, clipplane.Z);
    Vector3 centre = new Vector3(1f, -clipplane.X / clipplane.Y, 0f);
    Vector3 wall = Vector3.Cross(floor, centre);

    // Get distances from the planes
    // Distance is represented as a Vector, since it needs to hold
    // the direction in 3d space.
    Vector3 distanceToFloor = new Vector3(0f,   realspace.y ,0f,);
    Vector3 distanceToCentre = new Vector3(     realspace.x ,0f,0f,);
    Vector3 distanceToWall = new Vector3(0f,0f, realspace.z );

    // Create planes that contain all the possible positions of the point
    // based on the distance from point to the corresponding plane.
    Vector3 pointY = floor + distanceToFloor;
    Vector3 pointX = centre + distanceToCentre;
    Vector3 pointZ = wall + distanceToWall;

    // Now that we have all 3 point's dimensions, we can create a new vector that will hold its position.
    Vector3 point = new Vector3(pointX.x,pointY.y, pointZ.z);

    return point
}

请注意Unity中有一个plane结构。