Перемещение дочерних объектов при вращении родительского объекта
У меня проблема с попыткой перемещения простых моделей в тандеме. У меня есть 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 в ваш шейдер для преобразования вершин.