我正在尝试制作一辆简单的自行车,它有 2 个轮胎,当然是刚体。由于它只有 2 个轮胎,所以它一直在往下掉。
因此,为了平衡车辆,我尝试使用四元数仅在 Y 轴上旋转它,以使其保持站立状态,同时使其在另一个 2 轴(X 和 Z)上具有可移动性。
我采取的方法是检查车辆的旋转是否与它产生时的旋转(它产生站立时)不同,并基于该力将车辆旋转到它在坠落之前的站立方式仅使用 2 个轮胎而不是 4) 的不平衡。这样,我可以让车辆始终保持站立状态,但限制跨其他轴的移动,这反过来又不允许我的车辆侧向行驶,而只能直行和后退。
在您阅读代码之前,我想提一下,我已经简化并缩短了此代码以便于理解,我只是在寻求帮助以了解如何去做,而不是答案代码解决方案。
代码:
Quat qCurrentRotation = GetRotation(); // updated every frame
Quat qTargetRotation = qInitialRotation; // stored when vehicle spawned
qFinalRotation = Quat::CreateIdentity();
if (qCurrentRotation != qTargetRotation)
{
float fSmoothFactor = 0.1f;
qFinalRotation = Quat::CreateNlerp(qCurrentRotation, qTargetRotation, qTargetRotation);
mVehicle->SetRotation(qFinalRotation);
}
上面的代码使自行车具有与生成方式相同的旋转。虽然它是越野车,并使车辆闪烁。撇开这个不谈,有人可以告诉我如何使用四元数、插值和角度来仅停止我的车辆在一个轴 (Y) 上的旋转,这样它就不会倒下并允许它在其他两个轴 (X) 上移动&Z)。