Я могу нарисовать Model3DGroup нужным мне цветом, используя
Material material = new DiffuseMaterial(new SolidColorBrush(Colors.White));
GeometryModel3D model = new GeometryModel3D(mesh, material);
(следующий этот учебник)
для установки цвета GeometryModel3D, который я включаю в Model3DGroup.
У меня есть приложение, в котором я должен разместить карту на местности в 3D (местность полностью плоская), карта не является изображением, и у меня есть подробные данные о точках фигур, которые я хочу нарисовать, и У меня также есть объекты DrawingVisual всех форм, которые я хочу проецировать на трехмерную поверхность. В режиме 2D я рисую их на пользовательском холсте (производном от Canvas), куда я добавляю их, используя
myCanvas.addVisualChild(item);
myCanvas.addLogicvalChild(item);
Мой вопрос заключается в том, как «рисовать» или рисовать фигуры, линии и т. Д. На трехмерных предметах? Эти формы не полностью покрывают местность. Я попытался использовать класс Viewport2DVisual3D и попытался поместить холст на трехмерную поверхность (простой холст с кнопкой), используя следующий код:
Canvas testCanvas = new Canvas();
testCanvas.Background = Brushes.Green;
Button b1 = new Button();
b1.Content = "Hello there";
Canvas.SetTop(b1, 50);
Canvas.SetLeft(b1, 50);
Canvas.SetZIndex(b1, 2);
testCanvas.Children.Add(b1);
testVisual3d.Visual = testCanvas; // testVisual3d is a Viewport2DVisual3D declared in xaml
Но проблема в том, что я не могу понять, как Canvas или любой Visual "заполняет" класс Viewport2DVisual3D, потому что:
- Кнопка полностью заполнила холст.
- Пустые области холста (Canvas.SetTop (b1, 50)) не видны.
- Понятия не имею о размере холста, связанном с размером объекта Viewport2DVisual3D, поскольку кнопка всегда полностью заполняет объект.
Также я не могу использовать Viewport2DVisual3D везде, так как мне также приходится создавать модели зданий и т. Д., Когда я проецирую карту на трехмерную местность, поэтому мне придется рисовать области модели здания (которая будет Model3DGroup). ) иначе, чтобы дать реалистичные эффекты, но если мне удастся спроецировать карту на Viewport2DVisual3D, это решит множество проблем, поскольку я смогу напрямую проецировать все фигуры, включая сетку, на объект или ландшафт Viewport2DVisual3D.
Я использую .NET 4.0 и C #.
Пожалуйста, помогите.
Обновление
Использование этого кода решает начальную проблему размера и пространства холста:
Canvas testCanvas = new Canvas();
testCanvas.Background = Brushes.Green;
Button b1 = new Button();
b1.Width = 120;
b1.Height = 25;
testCanvas.Width = 200;
testCanvas.Height = 200;
b1.Content = "Hello there";
Canvas.SetTop(b1, 50);
Canvas.SetLeft(b1, 50);
Canvas.SetZIndex(b1, 2);
testCanvas.Children.Add(b1);
testVisual3d.Visual = testCanvas;
Размер Viewport2DVisual3D составляет
Positions="0,0,0 0,0,30 30,0,30 30,0,0"
И холст изменяет размеры, чтобы соответствовать границам Viewport2DVisual3D, но будет ли он работать с классом, производным от Canvas, в котором фигуры были непосредственно добавлены с использованием Canvas.AddVisualChild и Canvas.AddLogicalChild, я еще не попробовал это.
А также остается оригинальный вопрос рисования на Model3DGroup, как это сделать?