如何根据四个点计算平均地形坡度?

How can I calculate an average terrain slope based on four points?

我正在 Unity 中为车辆编写一个简单的物理系统,我正在尝试弄清楚如何根据四个点计算平均坡度以应用重力加速度。我可以像这样在车轮位置获得地形高度:

Terrain.activeTerrain.SampleHeight(wheel.position);

如何根据这四个点计算平均地形坡度?我考虑过计算不同点之间的方向向量,但我不确定如何将它们组合成一个斜率向量。

那不就是后轮中点和前轮中点之间的平均坡度吗?您可以通过将这些高度与其距离(投影)之差相除来得到角度的正切值。猜猜这太简单了? 假设有 4 个点 (x1,y1)、(x2,y2)、(x3,y3) 和 (x4,y4)。中间点为 xB = (x1+x2)/2、yB=(y1+y2)/2 和 xF=(x3+x4)/2 和 yF=(y3+y4)/2。则 Tan A = (yF-yB)/(xF-xB)

(假设所有 4 个轮子始终共面)我想你可以拿任何 3 个轮子,取高度样本

var wheels = new Vector3[3]{ wheel1.transform.position, wheel2.transform.position, wheel3.transform.position };
for(var i = 0; i < wheels.Length; i++)
{
    var w = wheels[i];
    w.y = Terrain.activeTerrain.SampleHeight(w)
    wheels[i]= w;
}

由此产生的 3 个点生成一个平面

var plane = new Plane(wheels[0], wheels[1], wheels[2]);

现在你可以取这些点中的任何一个,并取一个直线向上的向量。

var upPoint = wheels[0] + Vector3.up;

然后您可以使用平面上最近的点将该向量映射到平面上。

var planePoint = plane.ClosestPointOnPlane(upPoint);

作为最后一步,对该映射点和您的起始轮点之间的矢量进行归一化,您应该知道斜率的方向 + Y 分量告诉您它有多陡

var planeVector = wheels[0] - planePoint;
var direction = planeVector.normalized;

Debug.Log($"Slope direction is {direction} with a steepness factor of {direction.y} or also {-planeVector.magnitude}");

其中 planeVector.magnitudedirection.y 应该在 0(完全水平表面)和 -1(完全垂直表面)之间移动

大概是这样吧^^