Перемещение дочерних объектов при вращении родительского объекта

У меня проблема с попыткой перемещения простых моделей в тандеме. У меня есть 20 меньших моделей, прикрепленных к большей модели. По сути это летающая тарелка с несколькими внешними пушками. Я видел другие вопросы, такие как этот, которые выглядят почти так, как я хочу. Однако, это только создает перевод ничьей. Мне действительно нужно переместить дочерние модели в трехмерное пространство, потому что они могут быть уничтожены независимо и, следовательно, требуют обнаружения столкновений. Вот как я вращаю родителя (в функции Update()):

angle += 0.15f;

RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * Matrix.CreateRotationZ(MathHelper.ToRadians(angle) * MathHelper.PiOver2);

Я пробовал много решений, но позиционирование всегда отключено, поэтому они не выглядят привязанными. Это самое близкое, что я получил:

cannons[x].RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * 
Matrix.CreateRotationZ(MathHelper.ToRadians(angle + cannons[x].angle) * 
MathHelper.PiOver2);

cannons[x].position.X = (float)(Math.Cos(MathHelper.ToRadians(angle + cannons[x].originAngle) *
 MathHelper.PiOver2) * 475) + position.X;

cannons[x].position.Y = (float)(Math.Sin(MathHelper.ToRadians(angle + cannons[x].originAngle) *
 MathHelper.PiOver2) * 475) + position.Y;

Что я сделал не так в этом коде? В качестве альтернативы, если мой подход полностью отключен, каков правильный способ сделать это?

1 ответ

Решение

Вы должны использовать матричные преобразования для всего.

class Physics {

 public Vector3 Traslation;
 public Vector3 Scale;
 public Quaternion Rotation;

 public Physics Parent;
 public List<Physics> Children;
 public Matrix World;


 public Update() {
      World =   Matrix.CreateScale(Scale) 
              * Matrix.CreateFromQuaternion(Rotation) 
              * Matrix.CreateTranslation;
      if (Parent!=null) {
         World *= Parent.World ;
      }    
      foreach (var child in children) child.Update();         
 }
}

Поймите, что этот код не оптимизирован и может быть улучшен.

Таким образом, вы должны иметь физический объект для вашей большой модели и 20 физических объектов для маленьких моделей, привязанных к большой модели через свойство Parent.

если вам нужны Traslation, Rotation и Scale для ваших объектов в абсолютных координатах, вы можете использовать метод Matrix.Decompose, хотя гораздо лучше передать матрицу World в ваш шейдер для преобразования вершин.

Другие вопросы по тегам