所以我有这个地形和垂直平面设置,现在我想结合这两个意义来将平面的顶点移动到它们最近的resp。地形上的顶点。 我画了一张图来说明我的thoughts。 最终的结果是地形看起来有些厚度。
我还需要projection of the point on the terrain
我在之前的帖子中找到了这段代码:
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);
}

答案 0 :(得分:2)
我希望这会有所帮助:
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;
}
有关更有用的3D Math,请点击此处: https://github.com/GregLukosek/3DMath
答案 1 :(得分:0)
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;
}