У меня есть 3D сцена, где мои 3D модели загружаются в коде позади из файлов XAML.
Каждая модель состоит из дерева вложенных Model3DGroups, каждому из которых относились к различным преобразованиям она, чтобы расположить и ориентировать следующий субкомпонент модели в дереве. Эта модель затем используется в качестве содержания ModelVisual3D так, чтобы это могло быть отображено на экран.
Я хочу присоединить дочерний ModelVisual3D к 'родительскому' ModelVisual3D. Этот дочерний ModelVisual3D должен использовать все вложенные преобразования родительского ModelVisual3D.Content, чтобы правильно расположить и ориентировать себя в виртуальном пространстве. Например, первый ModelVisual3D является манипулятором, который имеет различные подвижные соединения, и я хочу присоединить инструмент на конце этой руки - другой ModelVisual3D. Как я могу получить доступ к этому составному преобразованию от родительского свойства содержания ModelVisual3Ds, чтобы позволить мне располагать следующий ModelVisual3D правильно относительно его родителя?
Как вы, несомненно, заметили, при группировке Model3D в Model3DGroup свойства Transform дочерних элементов объединяются со свойствами родительского элемента.
Похоже, вы спрашиваете, как вычислить чистую трансформацию для конкретной Model3D в дереве Model3D, которые составляют то, что вы называете своей "моделью". Для этого вам нужно знать (или уметь сканировать и обнаружить) путь от корневой Model3DGroup вниз к Model3D, для которой вы хотите найти преобразование.
Как только вы получите этот путь, все, что требуется, - это объединить свойства Transform на каждом уровне. Для этого просто создайте Transform3DGroup и добавьте в нее отдельные трансформации.
Например, если рука вашего робота имеет компоненты Model3D с именами "UpperArm", "LowerArm" и "Hand", и вы хотите узнать положение и угол руки, вы можете сделать следующее:
var combined = new Transform3DGroup();
combined.Children.Add(UpperArm.Transform);
combined.Children.Add(LowerArm.Transform);
combined.Children.Add(Hand.Transform);
Теперь вы можете найти местоположение (0,0,0) на руке следующим образом:
combined.Transform(new Point3D(0,0,0));
Аналогично вы можете найти другие точки и использовать их для позиционирования других ModelVisual3D.