Unity3d 获取平面上最近的点

Unity3d 获取平面上最近的点,unity3d,Unity3d,所以我有这个地形,有了垂直平面设置,现在我想把这两个意思结合起来,把平面的顶点移动到最近的位置。地形上的顶点。 我画了一幅画来说明我的想法。 最终的结果是地形看起来有一定的厚度 我还需要 我在上一个线程中发现了以下代码: float distance=点到平面的距离(smallObj.transform.position、wall.transform.position、wallNormal); 专用浮点平面位置(矢量3点位置、矢量3平面位置、矢量3平面法线) { 浮动sb、sn、sd; sn=

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

我还需要

我在上一个线程中发现了以下代码:

float distance=点到平面的距离(smallObj.transform.position、wall.transform.position、wallNormal);
专用浮点平面位置(矢量3点位置、矢量3平面位置、矢量3平面法线)
{
浮动sb、sn、sd;
sn=-Vector3.Dot(平面法线,(点位置-平面位置));
sd=矢量3.点(平面法线,平面法线);
sb=sn/sd;
Vector3结果=点位置+sb*平面法线;
返回向量3.距离(点位置、结果);
}
我希望这将有助于:

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;
}
有关更有用的三维数学,请参见此处:

sry我无法尽快回复您。投射点与统一中光线投射的命中点有什么不同吗?如果是这样的话,怎么办?平面法线也是我所碰到的三角形的曲面法线吗?欢迎来到堆栈溢出。当用一个公认的答案为一个五年的问题添加答案时,包含解释并指出你的答案所针对的问题的新方面是非常重要的。
Vector3 v_FindPointOnPlaneWithRayCast(Plane i_plane, Vector3 i_target)
{
    Vector3 vectorFind = new Vector3();

    Ray ray = new Ray(i_target, Vector3.forward);
    float enter = 0.0f;
    if (i_plane.Raycast(ray, out enter))
    {
        Vector3 hitPoint = ray.GetPoint(enter);
        vectorFind = hitPoint;
    }
    else
    {
        ray = new Ray(i_target, -Vector3.forward);
        if (i_plane.Raycast(ray, out enter))
        {
            Vector3 hitPoint = ray.GetPoint(enter);
            vectorFind = hitPoint;
        }
    }
    return vectorFind;
}