【发布时间】:2016-06-08 13:39:20
【问题描述】:
我正在开发一款游戏,该游戏将投掷对物理力做出反应的弹丸。我在游戏中使用了内置的 Unity Physics,但我正在绘制弹丸发射之前的轨迹。为此,我使用 LineRenderer 和一个简单的物理类来计算位置:
public class SlingPhysics
{
private Vector3 HalfGravity;
private float ForceMultiplier;
public void Init(Vector3 gravity, float slingForce, float mass, float drag)
{
HalfGravity = gravity / 2.0f;
ForceMultiplier = slingForce / mass / (1 + drag);
}
public Vector3 GetPosition(Vector3 start, Vector3 direction, float timeDelta)
{
Vector3 pos = direction * (timeDelta * ForceMultiplier);
pos.y += (HalfGravity.y * timeDelta * timeDelta);
return start + pos;
}
/// <summary>
/// Computes an array of Trajectory object positions by time.
/// </summary>
/// <returns>Number of positions filled into the buffer</returns>
/// <param name="startPos">Starting Position</param>
/// <param name="direction">Direction (and magnitude) vector</param>
/// <param name="timeIncrement">Time increment of the samples</param>
/// <param name="yFloor">Minimum height, below which is clipped</param>
/// <param name="positions">Buffer to fill with positions</param>
public int GetPositions(Vector3 startPos, Vector3 direction, float timeIncrement, float yFloor, Vector3[] positions)
{
int maxItems = positions.Length;
int i = 0;
for (; i < maxItems; i++)
{
Vector3 pos = GetPosition(startPos, direction, timeIncrement * i);
if (pos.y < yFloor)
break;
positions[i] = pos;
}
return i;
}
}
这很有效,并且(有点令人惊讶)与弹丸在发射时最终行进的实际轨迹完全匹配,并由 Unity 物理引擎控制。
但是现在,我们决定在刚体上引入阻力,轨迹不再完美。我可以继续尝试更改我的物理模型以匹配 Unity 正在做的事情,但这似乎是一场失败的战斗。
有没有办法使用 Unity 物理引擎预先计算和绘制轨迹?
如果没有,Unity Physics 中如何以数学方式实现拖动和角拖动?
是否有 Unity (5.3.4) 物理实现的文档来源?
【问题讨论】:
-
我搜索了同样的东西,但找不到任何官方文档。但是,自己测试它是相当容易的。我不记得我的头顶了,但是我使用了一个有阻力值的刚体,一个没有阻力值的刚体,只写了一个简单的脚本来模拟阻力,并尝试了几个典型的公式,结果证明是其中一个简单的。然后您仍然需要手动计算所有内容以匹配 Unity 的实现,因为它们没有提供任何您想要的 API。
-
Xarbrough,谢谢。尽管程序员的明智建议是避免追逐 Unity 的愚蠢,但我将追踪阻力公式并尝试一下。我的代码真的很简单,所以再复杂一点也不会害死我;希望到此为止。当下一个伟大的物理引擎问世时,我会跨过那座桥。