簡體   English   中英

計算兩個3D矢量與恆定加速度對齊所需的扭矩?

[英]Calculate Torque Required To Align Two 3D Vectors with Constant Acceleration?

我目前正在為衛星游戲構建簡化的反應控制系統,並且需要一種方法來使用該系統將衛星與世界空間坐標中的給定單位方向對齊。 因為這是一個游戲模擬,我偽造系統,只是在物體震中周圍施加扭矩力。

這很難,因為在我的情況下,扭矩的強度不能改變,它可以打開或關閉。 這是完全的力量或沒有力量。 計算扭矩需要施加的方向相對容易,但是我無法使其完全對齊而不會失去控制並陷入邏輯循環。 它需要在恰當的“時間”施加相反的力,以零角速度着陸在目標方向上。

到目前為止我所確定的是,我需要根據當前的角速度和兩個矢量之間的角度計算達到零速度所需的“時間”。 如果超過我達到零角度的時間,則需要施加相反的扭矩。 從理論上講,這也可以防止它在軸周圍“彈跳”太多。 我幾乎讓它工作,但在某些情況下似乎卡在一個方向施加力,所以我希望有人可以檢查邏輯。 我的模擬目前不考慮質量,因此您可以忽略慣性張量(除非它使計算更容易!)

對於一個軸 ,我目前正在這樣做,但我認為有人會有一個更優雅的解決方案,實際上可以同時計算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 ++之前的原型。

在此輸入圖像描述

從“計算方向”線開始,您可以直接計算3D中的校正扭矩矢量,如果您知道之前的校正即將超調,則修改其符號:

// 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
  }
}

好吧,我從上面的偽代碼中得到的是,當需要斷開的時間超過剩余時間直到達到角度0時,你想要開始制動。 您是否嘗試在斷開時間之前慢慢開始斷開(在短步驟中因為恆定的扭矩)超過角度0的時間?

當你這樣做並且你的衛星接近角度0並且速度非常低時,你可以將速度和角度設置為0,這樣它就不會再搖晃了。

你有沒有想過這個? 我正在研究UE4中的類似問題。 我也有不變的力量。 我正在轉向一個新的前向矢量。 我已經意識到時間無法預測。 例如,你在Z軸上以100度/秒的速度旋轉,反向力精確地在.015秒內完成所需的旋轉和速度,但下一幀需要.016秒才能渲染,你剛剛超過它不會改變你的力量。 我認為解決方案類似於通過在速度歸零時手動設置前向矢量來作弊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM