获取飞机上最近的点

adi*_*rma 3 unity-game-engine

所以我有这个地形和一个垂直的平面设置,现在我想结合这两个含义将平面的顶点移动到最近的顶点。地形上的顶点。我画了一张图来说明我的想法。最终结果是地形看起来有一定的厚度。

我还需要该点在地形上的投影

我在之前的线程中找到了这段代码:

    float distance = PointToPlaneDistance(smallObj.transform.position, wall.transform.position, wallNormal);

    private float PointToPlaneDistance(Vector3 pointPosition, Vector3 planePosition, Vector3 planeNormal)
    {
        float sb, sn, sd;

        sn = -Vector3.Dot(planeNormal, (pointPosition - planePosition));
        sd = Vector3.Dot(planeNormal, planeNormal);
        sb = sn / sd;

        Vector3 result = pointPosition + sb * planeNormal;
        return Vector3.Distance(pointPosition, result);
    }
Run Code Online (Sandbox Code Playgroud)
这里的结果向量是最近的点(我认为!)但是平面法线是什么?Unity有一个内置的mesh.normals,它给出了地形的所有表面法线。我应该在这里使用哪一个?

Gre*_*sek 5

我希望这个能帮上忙:

public static Vector3 ProjectPointOnPlane(Vector3 planeNormal, Vector3 planePoint, Vector3 point){

    float distance;
    Vector3 translationVector;

    //First calculate the distance from the point to the plane:
    distance = SignedDistancePlanePoint(planeNormal, planePoint, point);

    //Reverse the sign of the distance
    distance *= -1;

    //Get a translation vector
    translationVector = SetVectorLength(planeNormal, distance);

    //Translate the point to form a projection
    return point + translationVector;
}



//Get the shortest distance between a point and a plane. The output is signed so it holds information
//as to which side of the plane normal the point is.
public static float SignedDistancePlanePoint(Vector3 planeNormal, Vector3 planePoint, Vector3 point){

    return Vector3.Dot(planeNormal, (point - planePoint));
}



//create a vector of direction "vector" with length "size"
public static Vector3 SetVectorLength(Vector3 vector, float size){

    //normalize the vector
    Vector3 vectorNormalized = Vector3.Normalize(vector);

    //scale the vector
    return vectorNormalized *= size;
}
Run Code Online (Sandbox Code Playgroud)

如需更多有用的 3D 数学,请查看此处: https: //github.com/GregLukosek/3DMath