c++ - 仅在 1 个轴上旋转对象

标签 c++ rotation game-physics quaternions cryengine

我正在尝试制作一辆简单的自行车,它有 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);

}

上面的代码使自行车的旋转与生成时的旋转相同。尽管它是 buggy ,并且会使车辆闪烁。抛开这一点,有人能告诉我如何使用四元数、插值和角度来仅停止我的车辆在一个轴 (Y) 上的旋转,这样它就不会掉下来并允许它在另外两个轴 (X) 上移动&Z).

最佳答案

我建议采用不同的方法。如果您必须每帧重置旋转,这可能会影响您的性能并且非常“脏”。 也许尝试覆盖您的车辆类型的物理特性。 目前我这里没有代码,但文档(编码引用)和引擎/物理代码应该足以指导你。 也许看一看 GameSDK 代码,看看那里是如何处理车辆物理的。

关于c++ - 仅在 1 个轴上旋转对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33962401/

相关文章:

指向 OpenCV GpuMat 的 C++ 指针

c++ - 使用 atan2 将 - 1 到 1 的范围转换为度数

iphone - 如何检测 iPhone 正面朝上放在 table 上时是否正在旋转?

html - 在表中旋转标题时出现格式错误

game-engine - NVidia PhysX 3.4 的原生 C API

collision-detection - 用鼠标控制的 Racket 对快速移动的球进行碰撞检测的问题

c++ - 在 vs 2003 上将管道(处理程序)转换为 fd 时出错

c++ - 用另一个 constexpr 数组支撑成员数组的初始化

c# - 向鼠标当前位置旋转图像

javascript - 如何设置圆的物理大小 Phaser Arcade 模式