WPF 3D - позиционирование элементов Visual3D в 3D-сцене с использованием вложенных преобразований Model3DGroup? - PullRequest
6 голосов
/ 04 июня 2010

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

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

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

1 Ответ

2 голосов
/ 05 июня 2010

Как вы, несомненно, заметили, когда вы группируете Model3D в Model3DGroup, свойства Transform дочерних элементов объединяются со свойствами родительского.

Звучит так, будто вы спрашиваете, как вычислить сетевое преобразование вниз для конкретной Model3D в дереве Model3D, составляющих то, что вы называете своей "моделью". Для этого вам нужно знать (или иметь возможность сканировать и обнаруживать) путь от вашей корневой Model3DGroup до Model3D, для которой вы хотите найти преобразование.

Если у вас есть этот путь, все, что требуется, это объединить свойства Transform на каждом уровне. Для этого просто создайте группу Transform3DGroup и добавьте в нее отдельные преобразования.

Например, если ваша рука робота имеет компоненты Model3D с именами «UpperArm», «LowerArm» и «Рука», и вы хотите узнать положение и угол наклона руки, которую вы можете сделать:

 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...