Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Как обратиться к MeshGeometry3D в xaml-модели


Автор: liri2006 16.9.2010, 15:40
С помощью 3dTools в проект загружается модель, теперь хочу прикрутить возможность обработки событий по клику на части этой самой модели. Нашел пример:

                <ModelUIElement3D MouseDown="Cube1MouseDown">
                    <ModelUIElement3D.Transform>
                        <TranslateTransform3D OffsetZ="1.5" />
                    </ModelUIElement3D.Transform>
                    
                    <ModelUIElement3D.Model>
                        <GeometryModel3D Geometry="{StaticResource CubeMesh}">
                            <GeometryModel3D.Material>
                                <DiffuseMaterial x:Name="cube1Material" Brush="Blue" />
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </ModelUIElement3D.Model>
                </ModelUIElement3D>
таким образом MeshGeometry3D разделяется на отдельные элементы, которыми сопсно и манипулируют. Загвоздка в том шо у них мэши прописани там же в коде, а у меня это загружается из файла, вот и вопрос: как засунуть в эту строчку <GeometryModel3D Geometry="{StaticResource CubeMesh}"> свои MeshGeometry3D?

Автор: zel25b 20.9.2010, 19:05
У тебя в отдельном файле лежат модели в хамл коде?
Если так - то сначала десериализируй 3д модель в обьект, а потом уже этот обьект подключай к коду

Автор: liri2006 20.9.2010, 22:26
да модели в XAML файле. А можна небольшой пример?

Автор: zel25b 21.9.2010, 11:11
Принцип таков:
Код

//Сереализируем модель
            List<Type> types = new List<Type>();  //Типы которые содержатся в ГеометриМодел3Д
            types.Add(typeof(MatrixTransform3D));
            types.Add(typeof(MeshGeometry3D));
            types.Add(typeof(MaterialGroup));
            types.Add(typeof(DiffuseMaterial));
            types.Add(typeof(ImageBrush));
            types.Add(typeof(SolidColorBrush));
            types.Add(typeof(MatrixTransform));
            System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(GeometryModel3D), types.ToArray());
            System.IO.TextWriter writer = new System.IO.StreamWriter(@"D:\1.xml");
            ser.Serialize(writer, (_trackport.Model as Model3DGroup).Children[1]);
            writer.Close();

//Десериализируем
            System.IO.TextReader reader = new System.IO.StreamReader(@"D:\1.xml");
            GeometryModel3D geo = (GeometryModel3D)ser.Deserialize(reader);
            reader.Close();

//Заменяем модель
            Model3DGroup model = new Model3DGroup();
            model.Children.Add(geo);
            _trackport.Model = model;


Можно не заменять модель, а добавить в старую модель новую геометрию.

Принцип таков, а если у тебя по другому хранится модель в файле - надо уже думать как ее десериализовать

Автор: liri2006 1.10.2010, 01:05
Так, с этим разобрался, обошлось без сериализации\десериализации, но за помощь спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)