gpt4 book ai didi

c++ - 计算以恒定加速度对齐两个 3D vector 所需的扭矩?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:21 24 4
gpt4 key购买 nike

我目前正在为卫星游戏构建一个简化的 react 控制系统,并且需要一种方法来使用该系统将卫星对准世界空间坐标中的给定单位方向。因为这是一个游戏模拟,所以我伪造了系统,只是在物体震中周围施加扭矩力。

这很困难,因为在我的例子中,扭矩的强度不能变化,它要么打开要么关闭。要么全力以赴,要么无力。计算需要施加扭矩的方向相对容易,但我很难让它完美对齐而不会失控并陷入逻辑循环。它需要在精确的“时间”施加反作用力,以零角速度降落在目标方向上。

到目前为止我确定的是,我需要根据我当前的角速度和两个 vector 之间的角度计算达到零速度所需的“时间”。如果这超过了我达到零角的时间,那么它需要施加相反的扭矩。从理论上讲,这也将防止它围绕轴“弹跳”太多。我几乎让它工作了,但在某些情况下,它似乎卡住了向一个方向施加力,所以我希望有人可以检查逻辑。我的模拟目前没有考虑质量,所以你可以忽略惯性张量(除非它使计算更容易!)

对于一个轴,我目前正在这样做,但我认为有人会有一个更优雅的解决方案,实际上可以同时计算 Yaw 和 Pitch 轴(Roll 无效) .

Omega = Angular Velocity in Local-Space (Degrees Per Second)
Force = Strength of the Thrusters

// Calculate Time Variables
float Angle = AcosD(DotProduct(ForwardVector, DirectionVector));
float Time1 = Abs(Angle / Omega.Z); // Time taken to reach angle 0 at current velocity
float Time2 = Abs(DeltaTime * (Omega.Z / Force); // Time it will take to reach Zero velocity based on force strength.

// Calculate Direction we need to apply the force to rotate toward the target direction. Note that if we are at perfect opposites, this will be zero!
float AngleSign = Sign(DotProduct(RightVector, DirectionVector));

float Torque.Z = 0;
if (Time1 < Time2)
{
Torque.Z = AngleSign * Force;
}
else
{
Torque.Z = AngleSign * Force * -1.0f
}

// Torque is applied to object as a change in acceleration (no mass) and modified by DeltaSeconds for frame-rate independent force.

这远非优雅,而且肯定存在一些符号问题。你们知道实现此目标的更好方法吗?

编辑:如果有人了解虚幻引擎的蓝图系统,这就是我在将其移至 C++ 之前对其进行原型(prototype)设计的方式

enter image description here

最佳答案

从“计算方向”行开始,您可以改为直接计算 3D 中的校正扭矩 vector ,然后如果您知道先前的校正即将过冲,则修改其符号:

// Calculate Direction we need to apply the force to rotate toward the target direction
Torque = CrossProduct(DirectionVector, ForwardVector)
Torque = Normalize(Torque) * Force
if (Time2 < Time1)
{
Torque = -Torque
}

但是你应该处理有问题的情况:

// Calculate Direction we need to apply the force to rotate toward the target direction
Torque = CrossProduct(DirectionVector, ForwardVector)

if (Angle < 0.1 degrees)
{
// Avoid divide by zero in Normalize
Torque = {0, 0, 0}
}
else
{
// Handle case of exactly opposite direction (where CrossProduct is zero)
if (Angle > 179.9 degrees)
{
Torque = {0, 0, 1}
}

Torque = Normalize(Torque) * Force
if (Time2 < Time1)
{
Torque = -Torque
}
}

关于c++ - 计算以恒定加速度对齐两个 3D vector 所需的扭矩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33648662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com