Масштабирование VisuaBrush неправильно с Canvas в качестве визуального элемента

Я боролся с этой проблемой уже несколько дней, и мне не повезло, что она разрешилась или нашла какую-либо поддержку в сети. По сути, я пытаюсь создать VisualBrush с холстом в качестве визуального элемента. Я хочу иметь возможность нарисовать несколько линий на этом холсте и в конечном итоге отобразить его на трехмерной поверхности (2 параллельных треугольника, образующих прямоугольник). Я установил координаты текстуры и могу подтвердить, что все работает, просто используя ImageBrush или что-то в этом роде. Проблема, с которой я столкнулся, заключается в том, что холст отказывается сохранять свой размер и постоянно масштабируется в зависимости от содержимого, которое находится внутри него. Так, например, если холст имеет размер 100x100, и у меня есть одна линия внутри него (от 0, 0) до (50, 50), холст будет масштабироваться таким образом, чтобы только часть 50x50 с содержимым внутри отображалась в координаты текстуры. и на трехмерную поверхность. Я пробовал много комбинаций Viewport/Viewbox/StretchMode/Alignment/ и т.д. и не могу найти ничего, что мешает этому случиться. Я устанавливаю свойства ширины и высоты холста, поэтому не могу понять, почему он будет работать по-другому в VisualBrush по сравнению с тем, если я просто добавлю его в сетку или другой контейнер макета.

Вот некоторый код, чтобы проиллюстрировать проблему.

        // create the canvas for the VisualBrush
        Canvas drawCanvas = new Canvas();
        drawCanvas.Background = Brushes.Transparent; // transparent canvas background so only content is rendered
        drawCanvas.Width = 100;
        drawCanvas.Height = 100;

        // add a line to the canvas
        Line l = new Line();
        l.X1 = 0;
        l.Y1 = 0;
        l.X2 = 50;
        l.Y2 = 50;
        l.Stroke = Brushes.Red;
        l.StrokeThickness = 2;
        drawCanvas.Children.Add(l);

        // create rectangular surface mesh
        MeshGeometry3D TableMesh = new MeshGeometry3D();
        CreateRectangleModel(
            new Point3D(0, 0, 0),
            new Point3D(0, 0, 100),
            new Point3D(100, 0, 100),
            TableMesh);

        // need to include texture coordinates for our table mesh to map canvas to 3D model
        TableMesh.TextureCoordinates = new PointCollection { 
            new Point(0, 0), new Point(0, 1), new Point(1, 1),
            new Point(1, 1), new Point(0, 1), new Point(0, 0),
            new Point(1, 1), new Point(1, 0), new Point(0, 0),
            new Point(0, 0), new Point(1, 0), new Point(1, 1)
        };

        // finally make our visual brush with the canvas we have created
        VisualBrush vb = new VisualBrush();
        vb.Visual = drawCanvas;
        Material TableMaterial = new DiffuseMaterial(vb);

        // add our new model to the scene
        GeometryModel3D geometry = new GeometryModel3D(TableMesh, TableMaterial);
        Model3DGroup group = new Model3DGroup();
        group.Children.Add(geometry);
        ModelVisual3D previewTable = new ModelVisual3D();
        previewTable.Content = group;
        MainViewport.Children.Add(previewTable);

И единственная функция, на которую я ссылался,

    private void CreateRectangleModel(Point3D pStart, Point3D pCorner1, Point3D pEnd, MeshGeometry3D mesh)
    {
        //  pCorner -> O--O <- pEnd
        //             | /|
        //             |/ |
        //   pStart -> O--O <- pCorner2

        // find the remaining point for our rectangle
        Point3D pCorner2 = new Point3D(
            pStart.X + (pEnd.X - pCorner1.X),
            pStart.Y + (pEnd.Y - pCorner1.Y),
            pStart.Z + (pEnd.Z - pCorner1.Z));

        // add necessary triangles to our group (we create 2 facing up, 2 facing down)
        CreateTriangleModel(pStart, pCorner1, pEnd, mesh);
        CreateTriangleModel(pEnd, pCorner1, pStart, mesh);
        CreateTriangleModel(pEnd, pCorner2, pStart, mesh);
        CreateTriangleModel(pStart, pCorner2, pEnd, mesh);
    }

Я не могу заставить холст поддерживать установленный размер 100x100, если содержание детей не достигнет этих крайностей. Для моих целей координаты линии могут быть где угодно в пределах холста, и мне нужно, чтобы он поддерживал свою желаемую форму независимо от содержимого.

Любой совет будет принята с благодарностью!

1 ответ

Несколько вещей, чтобы попробовать:

  • Создайте файл изображения размером 100x100 пикселей вручную, а затем поместите его в ImageBrush и используйте эту кисть в своем DiffuseMaterial. Это должно подтвердить, что ваши текстурные координаты и т. Д. Установлены правильно.

  • Вместо использования прозрачного фона на холсте, попробуйте зеленый (чтобы увидеть, обрезается ли текстура на основе прозрачных пикселей)

  • Если выполняется обрезка вашей текстуры (из-за прозрачности)... тогда попробуйте поместить прямоугольник на холст в тех измерениях, которые вы хотите, чтобы текстура была... возможно, это что-то изменит.

  • Или попробуйте использовать RenderTargetBitmap, чтобы создать изображение из визуального представления Canvas..., а затем использовать это изображение в ImageBrush. (затем вы можете подтвердить, что изображение имеет ожидаемую площадь 100x100).

  • Наконец, вместо использования Canvas+VisualBrush для создания текстуры попробуйте создать кисть с помощью DrawingBrush+DrawingGroup+GeometryDrawing

Другие вопросы по тегам