3D WPF - Располагающий элементы Visual3D во вложенный Model3DGroup использования 3D сцены преобразовывает?

У меня есть 3D сцена, где мои 3D модели загружаются в коде позади из файлов XAML.

Каждая модель состоит из дерева вложенных Model3DGroups, каждому из которых относились к различным преобразованиям она, чтобы расположить и ориентировать следующий субкомпонент модели в дереве. Эта модель затем используется в качестве содержания ModelVisual3D так, чтобы это могло быть отображено на экран.

Я хочу присоединить дочерний ModelVisual3D к 'родительскому' ModelVisual3D. Этот дочерний ModelVisual3D должен использовать все вложенные преобразования родительского ModelVisual3D.Content, чтобы правильно расположить и ориентировать себя в виртуальном пространстве. Например, первый ModelVisual3D является манипулятором, который имеет различные подвижные соединения, и я хочу присоединить инструмент на конце этой руки - другой ModelVisual3D. Как я могу получить доступ к этому составному преобразованию от родительского свойства содержания ModelVisual3Ds, чтобы позволить мне располагать следующий ModelVisual3D правильно относительно его родителя?

6
задан Munro 4 June 2010 в 10:25
поделиться

1 ответ

Как вы, несомненно, заметили, при группировке 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.

2
ответ дан 17 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: