我正在为 Unity 中的车辆编写一个简单的物理系统,我试图弄清楚如何基于四个点计算平均坡度以应用重力加速度。我可以像这样获得车轮位置的地形高度:
Terrain.activeTerrain.SampleHeight(wheel.position);
如何根据这四个点计算平均地形坡度?我考虑过计算不同点之间的方向向量,但我不确定如何将它们组合成一个斜率向量。
我正在为 Unity 中的车辆编写一个简单的物理系统,我试图弄清楚如何基于四个点计算平均坡度以应用重力加速度。我可以像这样获得车轮位置的地形高度:
Terrain.activeTerrain.SampleHeight(wheel.position);
如何根据这四个点计算平均地形坡度?我考虑过计算不同点之间的方向向量,但我不确定如何将它们组合成一个斜率向量。
(假设所有 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.magnitude
和direction.y
都应该在0
(完全水平的表面)和-1
(完全垂直的表面)之间移动
我猜是这样的^^
那不是后轮中点和前轮中点之间的平均坡度吗?您可以通过除以这些高度和它们的距离(如投影)之间的差异来获得角度的正切。你猜这太简单了?假设 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)